我目前正在使用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()
答案 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;