1 回答

TA貢獻(xiàn)1712條經(jīng)驗(yàn) 獲得超3個(gè)贊
問題在于您正在嘗試np.memmap
在流程之間傳遞a ,而這是行不通的。
最簡單的解決方案是改為傳遞文件名,并讓子進(jìn)程處理memmap
相同的文件。
當(dāng)您通過通過參數(shù)將參數(shù)傳遞給子進(jìn)程或池方法multiprocessing
,或者從一個(gè)參數(shù)返回值(包括通過間接返回ProcessPoolExecutor
)時(shí),它通過調(diào)用pickle.dumps
該值,在各個(gè)進(jìn)程之間傳遞泡菜來工作(細(xì)節(jié)有所不同,但是不會(huì))不管是aPipe
還是aQueue
或其他),然后從另一側(cè)解開結(jié)果。
Amemmap
基本上只是在ped內(nèi)存中分配了一個(gè)mmap
對象。ndarray
mmap
而且Python不知道如何腌制mmap
對象。(如果嘗試這樣做,則將得到aPicklingError
或BrokenProcessPool
錯(cuò)誤,具體取決于您的Python版本。)
np.memmap
可以腌制A ,因?yàn)樗皇堑淖宇悾?code>np.ndarray但是腌制和去腌制實(shí)際上會(huì)復(fù)制數(shù)據(jù)并為您提供一個(gè)簡單的內(nèi)存數(shù)組。(如果您看的話data._mmap
,它是None
。)如果它給您一個(gè)錯(cuò)誤而不是靜默地復(fù)制所有數(shù)據(jù)(pickle-replacement庫dill
完全是這樣:),則可能會(huì)更好TypeError: can't pickle mmap.mmap objects
,但事實(shí)并非如此。
在進(jìn)程之間傳遞底層文件描述符不是不可能的-每個(gè)平臺(tái)上的細(xì)節(jié)都不同,但是所有主要平臺(tái)都可以做到這一點(diǎn)。然后,您可以使用傳遞的fdmmap
在接收端構(gòu)建一個(gè),然后再構(gòu)建一個(gè)memmap
。您甚至可以將其包裝到的子類中np.memmap
。但是我懷疑這是否有點(diǎn)困難,有人會(huì)做到這一點(diǎn),實(shí)際上dill
,如果不是numpy
它本身,那可能已經(jīng)成為它的一部分。
另一種選擇是顯式使用的共享內(nèi)存功能multiprocessing
,并在共享內(nèi)存而不是中分配數(shù)組mmap
。
但是,最簡單的解決方案是,就像我在頂部所說的那樣,只是傳遞文件名而不是對象,并讓每一側(cè)memmap
使用相同的文件。不幸的是,這確實(shí)意味著您不能只使用關(guān)閉時(shí)刪除功能NamedTemporaryFile
(盡管您使用它的方式已經(jīng)不可移植,并且在Windows上無法像在Unix上那樣工作),但是改變了與其他替代方案相比,這項(xiàng)工作的工作量可能仍然更少。
添加回答
舉報(bào)