0

savefig() が遅いため、多くの matplotlib 図を png ディスク ファイルに保存しようとしています。マルチプロセス モジュールを使用して速度を改善しようとしています。

これが私のコードです:(私の環境はWindows XP + python_2.6.1 + Matplotlib_1.2.0 + multiprocessing_0.70a1です)

import multiprocessing
from figure_creation_mudule import fig_list

def savefig_worker(fig, img_type, folder_path):
    file_name = fig.FM_figname 
    fig.savefig(folder_path+"\\"+file_name+"."+img_type, format=img_type)
    return None

if __name__ == '__main__':
    pool = multiprocessing.Pool()
    for fig in fig_list:
        pool.apply_async(savefig_worker, [fig, 'png', 'D:\\img_folder'])
    pool.close()
    pool.join()

Andfig_listは、他のモジュールからインポートされたリストであり、matplotlib figure オブジェクトが含まれています。

>>> fig_list
[<matplotlib.figure.Figure object at 0x0AAA1670>, <matplotlib.figure.Figure object at 0x0AD2B210>, <matplotlib.figure.Figure object at 0x0B277FD0>]

コードを実行すると、問題が発生します。

Exception in thread Thread-2:
Traceback (most recent call last):
  File "D:\Python\lib\threading.py", line 522, in __bootstrap_inner
    self.run()
  File "D:\Python\lib\threading.py", line 477, in run
    self.__target(*self.__args, **self.__kwargs)
  File "D:\Python\lib\multiprocessing\pool.py", line 225, in _handle_tasks
    put(task)
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed

どういう意味ですか ?それを修正する方法?

4

1 に答える 1

1

私はこれを調べました、そして確かにPool.apply_async()、舞台裏でオブジェクトをピクルスにします。これを確認するには、REPLでこれを試してください。

>>> from multiprocessing import Pool
>>> def test(obj):
...   print obj
... 
>>> class A():
...   def __getstate__(self):
...     print "pickling"
...     return {}
... 
>>> pool = Pool()
>>> pool.apply_async(test, [A()])
<multiprocessing.pool.ApplyResult object at 0x10bbe82d0>
pickling

>>> <__main__.A instance at 0x10bbe83b0>

multiprocessing.Poolこれを回避するには、仕事以外の何かを使用する必要があります。multiprocessing.Process働ける。ただし、あまり多くのプロセスを生成しないように注意する必要があります。そうしないと、速度を上げるのではなく、速度を落とすことになります。

編集:multiprocessing.Pool この質問/回答を使用することに熱心な場合は、役立つはずです

于 2013-03-05T13:40:50.550 に答える