2017-05-06 19 views
1

使用Python 3.x,我試圖迭代數據集字典(NetCDF4 datasets)。它們只是文件...NotImplementedError:X是不可挑選的

我要檢查在一個單獨的進程中的每個數據集:

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進程的數據傳遞給另一個進程?

+2

多處理模塊使用pickles將任意參數傳遞給每個進程。我對netCDF4不夠熟悉,無法提供確切的解決方案,但也許您可以在每個進程中加載​​數據集?換句話說,將文件名作爲參數傳遞給'DoProcessWork',而不是數據集本身。 – jasonharper

回答

1

multiprocessing需要序列化(pickle)輸入以將它們傳遞給將運行DoProcessWork的新進程。在你的情況下,數據集對象是一個問題,請參閱list of what can be pickled

對於您可能的解決方法是使用多處理與另一個讀取數據集的函數並調用DoProcessWork

+0

是的,你說得對。我想我幾乎意識到它是在一個進程中加載​​數據集,然後嘗試在另一個進程上讀取它...感謝您的幫助。 – pookie