【发布时间】:2021-01-29 03:06:13
【问题描述】:
我正在尝试使用其 Python 接口并行处理 VTK 中的大型数据集。为此,我想使用 joblib,因为我有(大量)独立快照,我想处理并收集在一个大型 numpy 矩阵中,例如:
import vtk
from vtk.numpy_interface import dataset_adapter as dsa
for i,snap in enumerate(snapshot_list):
myVtkFilter.SetInputData(snap)
result = myVtkFilter.GetOutput()
output[i, :] = dsa.WrapDataObject(result).CellData['myArray']
但是,我遇到了一些问题:
- 如果我使用默认的 loky 后端,Python 会抱怨输出矩阵不可写(这是一个非常大的数据集,像 (100, 1000000, 3) 这样的矩阵)。无论如何,它需要由 loky 序列化这一事实将是一项重大开销;
- 如果我想使用 Python 线程,代码运行正常,但在我看来,VTK 大部分时间都不会释放 GIL(大部分时间只使用一个内核)。 我希望像 numpy 一样,VTK 调用应该释放 GIL(根据此发行说明 http://vtk.1045678.n5.nabble.com/Announce-vtk-7-0-0-release-candidate-1-is-ready-td5735575.html),但似乎并非如此。
我正在使用 Python 3.7.3 和 VTK 8.1.2。有什么建议吗?
【问题讨论】:
-
VTK 确实发布了 GIL,所以我不确定这里有什么问题。
-
vtk.org/pipermail/vtk-developers/2018-November/036543.html 这个帖子似乎在讨论类似的事情。也许它可能与一些 VTK 构建标志有关?我只是使用标准的 pip3 install vtk,不确定是否必须从头开始编译 VTK 并添加一些我不知道的选项。
-
是的,它是相关的,确保使用 VTK_PYTHON_FULL_THREADSAFE。
-
仅供参考,此功能的最后修复在这里:gitlab.kitware.com/vtk/vtk/-/merge_requests/6064 并且存在于 VTK9 中,您应该使用它。