使用 python 和 VTK 进行内存管理
Memory management with python and VTK
我写了一个相当笨拙的 python 程序,它创建了一个特定几何形状的晶胞并复制它,这样我就得到了,例如单元格的 3x3x3 阵列。结果保存为 .stl。目标是直接创建这些结构而不是使用 CAD。
我的问题是计算时间很烦人(8x8x8 大约需要 2 分钟,这比我通常需要的要少)。最大的问题是,10x10x10 甚至是不可能的。 VTK 立即抛出错误 "Unable to allocate [large number] of elements of size 8 bytes." 这让我相信我的内存管理不足(不存在)。
我阅读了 vtkSmartPointer
,但似乎只能找到 C++ 的解释。如何正确使用 vtkSmartPointer
和 python?我应该补充一点,我对 C++ 没有任何经验。
由于程序的大小,MWE 是不可能的。这是我的算法管道的一部分的简短示例:
import vtk
appendFilter = vtk.vtkAppendPolyData()
# create all 12 struts and combine them into one object
for i in range(1, 13, 1):
tf = create_strut(i, node_dist, amp, d, sides, mode, render=False) # method that creates my unit cell out of 12 struts, parameters are irrelevant
appendFilter.AddInputData(tf.GetOutput())
appendFilter.Update()
# clean up poly data
cleanFilter = vtk.vtkCleanPolyData()
cleanFilter.SetInputConnection(appendFilter.GetOutputPort())
cleanFilter.Update()
# cut the cell to its right size
planes = plane_collection(node_dist) # method that generates 6 planes
clip = vtk.vtkClipClosedSurface()
clip.SetInputData(cleanFilter.GetOutput())
clip.SetClippingPlanes(planes)
clip.Update()
# assemble an array from the unit cell
array = duplicate_cells(clip, xyz[0], xyz[1], xyz[2], node_dist)
# save as .stl
data = array.GetOutputPort()
stlwriter = vtk.vtkSTLWriter()
stlwriter.SetInputConnection(data)
stlwriter.SetFileName("Z:/example.stl")
stlwriter.Update()
stlwriter.Write()
这应该表明我使用了很多过滤器并且从不关心删除它们或任何东西。 correct/preferred清理我的记忆的方法是什么?
自从我发布这篇文章后,我阅读了很多关于 VTK 的内容,Python 得出结论,Python 负责内存管理本身。 SmartPointers 和 Delete() 应该只在 C++ 环境中是必需的。
此外,我从 Python 2.7 和 VTK 6.2 升级到 Python 3.4 和 VTK 7.0,这极大地提高了程序的整体性能。因此,我认为问题出在旧的 VTK 版本上。
我写了一个相当笨拙的 python 程序,它创建了一个特定几何形状的晶胞并复制它,这样我就得到了,例如单元格的 3x3x3 阵列。结果保存为 .stl。目标是直接创建这些结构而不是使用 CAD。
我的问题是计算时间很烦人(8x8x8 大约需要 2 分钟,这比我通常需要的要少)。最大的问题是,10x10x10 甚至是不可能的。 VTK 立即抛出错误 "Unable to allocate [large number] of elements of size 8 bytes." 这让我相信我的内存管理不足(不存在)。
我阅读了 vtkSmartPointer
,但似乎只能找到 C++ 的解释。如何正确使用 vtkSmartPointer
和 python?我应该补充一点,我对 C++ 没有任何经验。
由于程序的大小,MWE 是不可能的。这是我的算法管道的一部分的简短示例:
import vtk
appendFilter = vtk.vtkAppendPolyData()
# create all 12 struts and combine them into one object
for i in range(1, 13, 1):
tf = create_strut(i, node_dist, amp, d, sides, mode, render=False) # method that creates my unit cell out of 12 struts, parameters are irrelevant
appendFilter.AddInputData(tf.GetOutput())
appendFilter.Update()
# clean up poly data
cleanFilter = vtk.vtkCleanPolyData()
cleanFilter.SetInputConnection(appendFilter.GetOutputPort())
cleanFilter.Update()
# cut the cell to its right size
planes = plane_collection(node_dist) # method that generates 6 planes
clip = vtk.vtkClipClosedSurface()
clip.SetInputData(cleanFilter.GetOutput())
clip.SetClippingPlanes(planes)
clip.Update()
# assemble an array from the unit cell
array = duplicate_cells(clip, xyz[0], xyz[1], xyz[2], node_dist)
# save as .stl
data = array.GetOutputPort()
stlwriter = vtk.vtkSTLWriter()
stlwriter.SetInputConnection(data)
stlwriter.SetFileName("Z:/example.stl")
stlwriter.Update()
stlwriter.Write()
这应该表明我使用了很多过滤器并且从不关心删除它们或任何东西。 correct/preferred清理我的记忆的方法是什么?
自从我发布这篇文章后,我阅读了很多关于 VTK 的内容,Python 得出结论,Python 负责内存管理本身。 SmartPointers 和 Delete() 应该只在 C++ 环境中是必需的。
此外,我从 Python 2.7 和 VTK 6.2 升级到 Python 3.4 和 VTK 7.0,这极大地提高了程序的整体性能。因此,我认为问题出在旧的 VTK 版本上。