【问题标题】:Saving multiple matplotlib figures with multiprocessing使用多处理保存多个 matplotlib 图形
【发布时间】:2014-07-21 13:16:02
【问题描述】:

我有一个代码,它从名为 001.txt、002.txt、...、411.​​txt 的多个文件中读取数据。我想从每个文件中读取数据,绘制它们,并保存为 001.jpg、002.jpg、...、411.​​jpg。

我可以通过循环文件来做到这一点,但我想使用多进程模块来加快速度。
但是,当我使用下面的代码时,计算机挂起 - 我无法单击任何内容,但鼠标移动,声音继续。然后我必须关闭计算机。

我显然误用了 matplotlib 的多进程模块。我使用了与以下代码非常相似的东西来实际生成数据,并毫无问题地保存到文本文件中。我错过了什么?

    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的。

标签: python matplotlib multiprocessing


【解决方案1】:

使用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))

另请注意,我用进程池替换了单独进程的创建(它可以更好地扩展到许多图片,因为它只使用与可用内核一样多的进程)。

【讨论】:

  • 使用您的建议会出现以下错误:在 [2] 中:% run -i test.py 线程 Thread-3 中的异常:回溯(最近一次调用最后一次):文件“/usr/lib/ python2.7/threading.py”,第 552 行,在 bootstrap_inner self.run() 文件“/usr/lib/python2.7/threading.py”,第 505 行,运行 self.__target(*self. __args, **self.__kwargs) 文件“/usr/lib/python2.7/multiprocessing/pool.py”,第 342 行,在 _handle_tasks put(task) PicklingError: Can't pickle : 属性查找__builtin.function 失败
  • 另外,我使用的是 python 2.7。我明白你为什么现在使用游泳池了。之前,我一直将数据分成 4 个“块”,每个核心一个。谢谢!
  • 这个错误很奇怪,因为据我所知,除了number 之外,不应强迫它腌制任何东西。我用 python2.7 对其进行了测试,它就像一个魅力。其实这段代码也适用于我机器上的python3.4。
  • 我刚刚在另一台计算机上尝试了您的代码,它运行良好。我在有问题的计算机上尝试了类似的代码,但它们都出现了相同的错误......我将接受你的答案(因为它有效),但你知道可能出了什么问题吗?我应该重新安装matplotlib,还是更险恶的错误?以 MPI 为例?
  • 好的,所以我没有使用 ipython,而是从 vanilla python 调用脚本,它可以工作,所以错误与 Ipython 相关。谢谢!
猜你喜欢
  • 2019-10-28
  • 2018-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多