2017-05-06 9 views
1

Python 3.xを使用して、データセットの辞書(NetCDF4 datasets)を反復しようとしています。彼らはちょうど私が別のプロセスで各データセットを調べたい...NotImplementedError:Xはpicklableではありません

をファイルです:

def DoProcessWork(datasetId, dataset): 
    parameter = dataset.variables["so2"] 
    print(parameter[0,0,0,0]) 

if __name__ == '__main__': 
    mp.set_start_method('spawn') 
    processes = [] 
    for key, dataset in datasets.items(): 
     p = mp.Process(target=DoProcessWork, args=(key, dataset,)) 
     p.start() 
     processes.append(p) 

私は私のプログラムを実行すると、私は「pickable」

File "C:\Program Files (x86)\Python36-32\lib\multiprocessing\process.py", line 105, in start 
    self._popen = self._Popen(self) 
    File "C:\Program Files (x86)\Python36-32\lib\multiprocessing\context.py", line 223, in _Popen 
    return _default_context.get_context().Process._Popen(process_obj) 
    File "C:\Program Files (x86)\Python36-32\lib\multiprocessing\context.py", line 322, in _Popen 
    return Popen(process_obj) 
    File "C:\Program Files (x86)\Python36-32\lib\multiprocessing\popen_spawn_win32.py", line 65, in __init__ 
    reduction.dump(process_obj, to_child) 
    File "C:\Program Files (x86)\Python36-32\lib\multiprocessing\reduction.py", line 60, in dump 
    ForkingPickler(file, protocol).dump(obj) 
    File "netCDF4\_netCDF4.pyx", line 1992, in netCDF4._netCDF4.Dataset.__reduce__ (netCDF4\_netCDF4.c:16805) 
NotImplementedError: Dataset is not picklable 

に関するいくつかのメッセージが表示されます私は間違って何をしていますか?これをどうすれば解決できますか? ファイルを開くことが別のプロセスで行われている可能性があります。そのため、1つのプロセスにロードされたデータを別のプロセスに渡そうとしているため、エラーが発生していますか?

+2

マルチプロセッシングモジュールはpickleを使用して、任意のパラメータを各プロセスに渡します。 NetCDF4に精通しているわけではありませんが、各プロセスでデータセットを読み込むことは可能でしょうか?つまり、データセット自体ではなく、ファイル名を 'DoProcessWork'の引数として渡します。 – jasonharper

答えて

1

multiprocessingは、DoProcessWorkを実行する新しいプロセスにそれらを渡すために入力をシリアライズ(ピクル)する必要があります。あなたのケースでは、データセットオブジェクトは問題です。list of what can be pickledを参照してください。

可能な回避策は、データセットを読み取る別の関数でマルチプロセッシングを使用し、DoProcessWorkを呼び出します。

+0

ええ、そうです。私は、あるプロセスでデータセットをロードしてから、別のプロセスでデータセットを読み込もうとしていたことに気付いた。助けてくれてありがとう。 – pookie

関連する問題