【发布时间】:2014-08-03 18:27:57
【问题描述】:
我想渲染大约 500 张图像并将它们保存到不同的 png 文件中,因此我编写了一个包含我的数据集和渲染函数的小类
from mayavi import mlab
mlab.options.offscreen=True
class Dataset(object):
def __init__(self):
some init stuff etc
.
.
.
.
def save_current_frame_to_png(self, filename):
mlab.contour3d(self.frame_data, contours =30, opacity=0.2)
mlab.savefig(filename)
mlab.clf()
mlab.close()
gc.collect()
def create_movie_files(self):
folder_name = "animation"
try:
os.makedirs(folder_name)
except OSError:
raise OSError("Directory already exists.")
self.__go_to_first_frame()
for i in range(self.frames):
filename = "".join([folder_name, "/%.5i" % i, ".png"])
print filename
self.save_current_frame_to_png(filename)
self.read_single_frame()
self.__go_to_first_frame()
所以一切似乎都运行良好,但我查看了内存使用量上升的情况
直到系统崩溃。所以我尝试使用mlab.clf() 和gc.collect() 来保持我的记忆力低,但这不起作用。我找到了mlab.close() 的解决方案,它似乎适用于内存使用,但这带来了一个新问题。
每次渲染新图像时,mayavi 也会创建一个新窗口,所以在
程序崩溃了大约 200 个窗口。也许有可能完全禁用窗户?在我看来mlab.options.offscreen=True 只禁用在当前窗口内绘图。
编辑:
self.frame_data 是一个形状为 (100,100,100) 的 numpy 数组,self.read_single_frame() 只是从文本文件中读取下一帧并将其存储在 self.frame_data 中。此功能不会增加内存,如果我关闭渲染,内存使用率将保持在 1.2%。
【问题讨论】:
-
你能显示
some init stuff吗?特别是salf.frame_data是什么?另外,你能发帖self.read_single_frame()吗?因为您的问题是由于您将大量数据存储在内存中,所以您在不再需要时在某处保留对它的引用。 -
self.frame_data 是一个形状为 (100,100,100) 的 numpy 数组,self.read_single_frame() 只是从文本文件中读取下一帧并将其存储在 self.frame_data 中。此功能不会增加内存,如果我关闭渲染,内存使用率将保持在 1.2%。
-
这是一个很好的问题。我无法重现您的所有错误——当使用
mlab.close基本上关闭生成的每个图形时,我从未耗尽内存并且能够滚动浏览 500 组(非常简单的)图像。我认为原因是我的场景有较低的内存限制或者我的系统有更多的内存,并且无论如何生成 mayavi 场景然后关闭它们会导致一些内存泄漏。source.remove()和mlab.clf()这样的函数在内存泄漏方面做得不好,这绝对是一件麻烦事。