【问题标题】:NotImplementedError: X is not picklableNotImplementedError:X 不可腌制
【发布时间】:2017-05-06 20:35:36
【问题描述】:

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

当我运行我的程序时,我收到一些关于“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

我做错了什么?我怎样才能解决这个问题? 难道是打开文件是在另一个进程上完成的,所以我收到一个错误,因为我试图将一个进程上加载的数据传递给另一个进程?

【问题讨论】:

  • 多处理模块使用pickles将任意参数传递给每个进程。我对 netCDF4 不够熟悉,无法提出确切的解决方案,但也许您可以在每个进程中加载​​数据集?换句话说,将文件名作为参数传递给DoProcessWork,而不是数据集本身。

标签: python python-3.x pickle


【解决方案1】:

multiprocessing 需要序列化(腌制)输入以将它们传递给将运行DoProcessWork 的新进程。在您的情况下,数据集对象是一个问题,请参阅list of what can be pickled

一种可能的解决方法是将多处理与另一个函数一起使用,该函数读取数据集并在其上调用 DoProcessWork

【讨论】:

  • 是的,你是对的。我想我几乎意识到它是在一个进程中加载​​数据集,然后尝试在另一个进程中读取它......感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-08
  • 2011-04-05
  • 2011-05-04
  • 2012-11-21
  • 2016-02-21
  • 1970-01-01
相关资源
最近更新 更多