2

実行する必要がある計算のリストがあります。私はそれらを使用して並列化しています

from pathos.multiprocessing import ProcessingPool
pool = ProcessingPool(nodes=7)
values = pool.map(helperFunction, someArgs)

helperFunctionと同じファイルParameters定義されている というクラスを作成します

import otherModule
class Parameters(otherModule.Parameters):
    ...

ここまでは順調ですね。helperFunctionは、オブジェクトに基づいていくつかの計算を行い、Parametersその属性の一部を変更し、最後に を使用してそれらを保存しますpickle。保存を行うヘルパー関数 (別のモジュールから) の関連する抜粋を次に示します。

import pickle
import hashlib
import os
class cacheHelper():

    def __init__(self, fileName, attr=[], folder='../cache/'):
        self.folder = folder

        if len(attr) > 0:
            attr = self.attrToName(attr)
        else:
            attr = ''
        self.fileNameNaked = fileName
        self.fileName = fileName + attr

    def write(self, objects):
        with open(self.getFile(), 'wb') as output:
            for object in objects:
                pickle.dump(object, output, pickle.HIGHEST_PROTOCOL)

pickle.dump()到達すると、デバッガーが実際にその例外に直面したワーカーにステップインしないため、デバッグが難しい例外が発生します。したがって、ダンプが発生する直前にブレークポイントを作成し、そのコマンドを手動で入力しました。出力は次のとおりです。

>>> pickle.dump(objects[0], output, pickle.HIGHEST_PROTOCOL)
Traceback (most recent call last):
  File "/usr/local/anaconda2/envs/myenv2/lib/python2.7/site-packages/IPython/core/interactiveshell.py", line 2885, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-1-4d2cbb7c63d1>", line 1, in <module>
    pickle.dump(objects[0], output, pickle.HIGHEST_PROTOCOL)
  File "/usr/local/anaconda2/envs/myenv2/lib/python2.7/pickle.py", line 1376, in dump
    Pickler(file, protocol).dump(obj)
  File "/usr/local/anaconda2/envs/myenv2/lib/python2.7/pickle.py", line 224, in dump
    self.save(obj)
  File "/usr/local/anaconda2/envs/myenv2/lib/python2.7/pickle.py", line 331, in save
    self.save_reduce(obj=obj, *rv)
  File "/usr/local/anaconda2/envs/myenv2/lib/python2.7/pickle.py", line 396, in save_reduce
    save(cls)
  File "/usr/local/anaconda2/envs/myenv2/lib/python2.7/pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "/usr/local/anaconda2/envs/myenv2/lib/python2.7/site-packages/dill/dill.py", line 1203, in save_type
    StockPickler.save_global(pickler, obj)
  File "/usr/local/anaconda2/envs/myenv2/lib/python2.7/pickle.py", line 754, in save_global
    (obj, module, name))
PicklingError: Can't pickle <class '__main__.Parameters'>: it's not found as __main__.Parameters

helperFunction奇妙なことに、これは、並列化しない場合、つまり手動でループスルーする場合には発生しません。私はParameters(親クラスではなく)正しいものを開いていると確信しています。

再現可能な例がないとデバッグが難しいことはわかっていますが、この部分での解決策は期待できません。おそらく、より一般的な質問は次のとおりです。

pickle.dump()別のモジュールを介して使用するコードを並列化する場合、何に注意する必要がありますか?

4

1 に答える 1