使用VTK的Python脚本中的内存泄漏

时间:2014-02-26 12:40:05

标签: python memory vtk

我目前正在使用Python脚本来处理以EnSight Gold格式存储的信息。我的Python(2.6)scipt使用VTK(5.10.0)来处理文件,我使用vtkEnSightGoldReader来读取数据,并循环执行时间步骤。原则上,这适用于较小的数据集,但是,对于大型数据集(GB),我看到内存使用(通过top)在进程运行时随时间增加。这种内存填充速度很慢,但在某些情况下问题是不可避免的。

以下脚本是我将问题简化为最低效的脚本。

import vtk

reader = vtk.vtkEnSightGoldReader()

reader.SetCaseFileName("case.case")
reader.Update()

# Get time values
timeset=reader.GetTimeSets()
time=timeset.GetItem(0)
timesteps=time.GetSize()

#reader.ReleaseDataFlagOn()

for j in range(timesteps):
    curTime=time.GetTuple(j)[0]
    print curTime
    reader.SetTimeValue(curTime)
    reader.Update()

    #reader.RemoveAllInputs()

我的问题是,如何卸载/替换存储在内存中的数据,而不是连续使用更多内存?

正如您在我的源代码中看到的,我尝试了成员函数“RemoveAllInputs”和“ReleaseDataFlagOn”,但它们不起作用或者我以错误的方式使用它们。幸运的是,我没有更接近解决方案。

我尝试的其他方法是DeepCopy()方法,我在VTK website找到了这种方法。但是,似乎这种方法对我没用,因为我甚至在调用GetOutput()

之前就遇到了内存问题

1 个答案:

答案 0 :(得分:0)

vtkEnsightGoldReader确实存在(次要)内存泄漏。内存泄漏是未正确清除收集对象的结果,这对于处理非常大的数据集而言变得明显。从技术上讲,它不是一个记忆漏洞,因为它在运行后被正确清除。

这只能通过将补丁应用于VTK源并重新编译来解决。我通过Kitware的人收到了下面的补丁,所以我认为这是在VTK的更高版本中推出的。

diff --git a/IO/vtkEnSightReader.cxx b/IO/vtkEnSightReader.cxx
index 68a9b8f..7ab8ddd 100644
--- a/IO/vtkEnSightReader.cxx
+++ b/IO/vtkEnSightReader.cxx
@@ -985,6 +985,8 @@ int vtkEnSightReader::ReadCaseFileTime(char* line)
   int timeSet, numTimeSteps, i, filenameNum, increment, lineRead;
   float timeStep;

+  this->TimeSetFileNameNumbers->RemoveAllItems();
+
   // found TIME section
   int firstTimeStep = 1;