首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用VTK的Python脚本中的内存泄漏

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

Stack Overflow用户
提问于 2014-02-26 12:40:04
回答 1查看 584关注 0票数 0

我目前正在使用Python来处理存储在EnSight黄金格式中的信息。我的Python2.6使用VTK (5.10.0)处理文件,在这里我使用vtkEnSightGoldReader读取数据,并通过时间步骤循环。原则上,这可以用于较小的数据集,但是对于大型数据集(GBs),我看到在进程运行时,内存使用量(通过top)随着时间的增加而增加。这种内存填充缓慢,但在某些情况下,问题是不可避免的。

下面的脚本是我将问题降低到的最低效率脚本。

代码语言:javascript
复制
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()之前就会遇到内存问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-19 13:07:56

vtkEnsightGoldReader中确实存在(次要的)内存泄漏。内存泄漏是由于未正确清除集合对象造成的,而收集对象只在处理非常大的数据集时才会变得明显。从技术上讲,这不是内存泄漏,因为它在运行后会被正确清除。

这只能通过向VTK源代码应用补丁并重新编译来解决。我通过Kitware的人收到了下面的修补程序,所以我假设这是在VTK的以后版本中推出的。

代码语言:javascript
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22041708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档