我目前正在使用Python来处理存储在EnSight黄金格式中的信息。我的Python2.6使用VTK (5.10.0)处理文件,在这里我使用vtkEnSightGoldReader读取数据,并通过时间步骤循环。原则上,这可以用于较小的数据集,但是对于大型数据集(GBs),我看到在进程运行时,内存使用量(通过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网站上找到了这种方法。但是,这种方法似乎对我没有用,因为我甚至在调用GetOutput()之前就会遇到内存问题。
发布于 2014-03-19 13:07:56
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;https://stackoverflow.com/questions/22041708
复制相似问题