使用Python 3.x,我试图迭代数据集字典(NetCDF4 datasets)。它们只是文件......
我想在一个单独的过程中检查每个数据集:
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)
当我运行我的程序时,我收到一些关于'可选'的信息
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个进程上加载的数据传递给另一个进程?
答案 0 :(得分:1)
multiprocessing
需要序列化(pickle)输入以将它们传递给将运行DoProcessWork
的新进程。在您的情况下,数据集对象是一个问题,请参阅list of what can be pickled。
可能的解决方法是将多处理与另一个函数一起使用,该函数读取数据集并在其上调用DoProcessWork
。