在MayaVi中保存多个图像

15

我想渲染大约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 吗?特别是 self.frame_data 是什么?另外,你能发一下 self.read_single_frame() 吗?因为你的问题是由于在内存中存储了大量数据,所以当不再需要时仍然会引用它。 - Aleksander Lidtke
self.frame_data 是一个形状为 (100,100,100) 的 numpy 数组,而 self.read_single_frame() 只是从文本文件中读取下一帧并将其存储在 self.frame_data 中。这些函数不会增加内存使用量,如果关闭渲染,内存使用率将保持在 1.2%。 - jrsm
这是一个很好的问题。我无法重现你所有的错误——当使用mlab.close来关闭每个生成的图形时,我从未遇到过内存不足的情况,并且能够滚动浏览500组(非常简单的)图像。我认为原因可能是我的场景具有较低的内存限制或者我的系统具有更多的内存,在任何情况下,生成mayavi场景然后关闭它们会导致一定量的内存泄漏。确实令人烦恼的是,像source.remove()mlab.clf()这样的函数在处理内存泄漏方面表现不佳。 - aestrivex
1个回答

0

你应该在保留 mlab.close() 的同时隐藏 mlab.show()。这样它就能正常工作了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接