使用多进程保存多个Matplotlib图像

3
我有一段代码,可以从多个文件中读取数据,这些文件的名称为001.txt、002.txt、...,411.txt。我想要从每个文件中读取数据,绘制图形,并将其保存为001.jpg、002.jpg、...,411.jpg。
我可以通过循环遍历文件来实现这一点,但我想使用multiprocess模块加速处理速度。
然而,当我使用下面的代码时,计算机会挂起-我无法点击任何东西,但鼠标可以移动,声音也在继续播放。然后我必须强制关闭计算机。
很明显,我在使用matplotlib时误用了multiprocess模块。我已经使用类似于以下代码的内容生成数据,并将其保存到文本文件中,没有出现任何问题。我错过了什么?
    import multiprocessing

    def do_plot(number):
        fig = figure(number)

        a, b = random.sample(range(1,9999),1000), random.sample(range(1,9999),1000)
        # generate random data
        scatter(a, b)

        savefig("%03d" % (number,) + ".jpg")
        print "Done ", number
        close()



    for i in (0, 1, 2, 3):
        jobs = []
    #    for j in chunk:
        p = multiprocessing.Process(target = do_plot, args = (i,))
        jobs.append(p)
        p.start()
    p.join()

我应该补充一下,我有一台四核机器运行Linux Mint。我也通过pylab操作Python。 - phys_geo_person
1个回答

2
在使用multiprocessing时,最重要的是只在主进程中运行模块的主要代码。可以通过如下所示的测试if __name__ == '__main__'来实现这一点:
import matplotlib.pyplot as plt
import numpy.random as random
from multiprocessing import Pool


def do_plot(number):
    fig = plt.figure(number)

    a = random.sample(1000)
    b = random.sample(1000)

    # generate random data
    plt.scatter(a, b)

    plt.savefig("%03d.jpg" % (number,))
    plt.close()

    print("Done ", number)


if __name__ == '__main__':
    pool = Pool()
    pool.map(do_plot, range(4))

请注意,我将单独进程的创建替换为了进程池(当处理许多图片时,它可以更好地扩展,因为它只使用你可用的核心数量的进程)。

使用您的建议会出现以下错误:In [2]: % run -i test.py Exception in thread Thread-3: Traceback (most recent call last): File "/usr/lib/python2.7/threading.py", line 552, in __bootstrap_inner self.run() File "/usr/lib/python2.7/threading.py", line 505, in run self.__target(*self.__args, **self.__kwargs) File "/usr/lib/python2.7/multiprocessing/pool.py", line 342, in _handle_tasks put(task) PicklingError: 无法pickle : 属性查找__builtin__.function失败 - phys_geo_person
另外,我正在使用Python 2.7。现在我明白你为什么使用了池。之前,我一直将数据分成4个“块”,每个核心一个。谢谢! - phys_geo_person
错误很奇怪,因为据我所见,它不应该强制除了number之外的任何东西进行pickle。我用python2.7测试过了,运行得非常好。实际上,在我的机器上,这段代码也可以在python3.4上运行。 - David Zwicker
我刚刚在另一台电脑上尝试了你的代码,它完全正常。我在出问题的电脑上尝试了类似的代码,但它们都遇到了同样的错误... 我会接受你的答案(因为它有效),但你有什么想法是可能出了问题吗?我应该重新安装matplotlib,还是有更严重的问题?比如MPI? - phys_geo_person
没有使用 --pylab 标志,它可以正常工作。如果您从外部文件调用函数并单独运行主函数,它也可以正常工作。看起来这不是一个新问题:http://thread.gmane.org/gmane.comp.python.ipython.user/4052 只有在使用 ipython + --pylab 时才会出现这种情况。非常感谢您的帮助! - phys_geo_person
显示剩余2条评论

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