[英]No space left while using Multiprocessing.Array in shared memory
我正在使用 Python 的多處理函數在具有大約 500GB RAM 的機器上並行運行我的代碼。 為了在不同的工作人員之間共享一些數組,我創建了一個Array
對象:
N = 150
ndata = 10000
sigma = 3
ddim = 3
shared_data_base = multiprocessing.Array(ctypes.c_double, ndata*N*N*ddim*sigma*sigma)
shared_data = np.ctypeslib.as_array(shared_data_base.get_obj())
shared_data = shared_data.reshape(-1, N, N, ddim*sigma*sigma)
這對於sigma=1
,但對於sigma=3
一個硬盤驅動器緩慢填充,直到不再有可用空間,然后該過程失敗並出現此異常:
OSError: [Errno 28] No space left on device
現在我有兩個問題:
編輯:我在網上找到了一些建議,該數組存儲在“共享內存”中。 但是/dev/shm
設備有更多的可用空間,因為/dev/sda1
由上面的代碼填充。 這是此代碼的(相關部分)strace 日志。
編輯#2 :我想我已經找到了解決這個問題的方法。 通過查看源代碼,我發現multiprocessing
嘗試在一個目錄中創建一個臨時文件,該文件是通過使用確定的
process.current_process()._config.get('tempdir')
在腳本開始時手動設置此值
from multiprocessing import process
process.current_process()._config['tempdir'] = '/data/tmp/'
似乎正在解決這個問題。 但我認為這不是解決問題的最佳方法。 那么:還有其他建議如何處理嗎?
這些數據大於 500GB。 sys.getsizeof()
在我的機器上只是shared_data_base
是 826.2GB , sys.getsizeof()
是pympler.asizeof.asizeof()
。 即使它們只有 500GB,您的機器也需要一些內存才能運行。 這就是為什么數據要寫入磁盤的原因。
import ctypes
from pympler.asizeof import asizeof
import sys
N = 150
ndata = 10000
sigma = 3
ddim = 3
print(sys.getsizeof(ctypes.c_double(1.0)) * ndata*N*N*ddim*sigma*sigma)
print(asizeof(ctypes.c_double(1.0)) * ndata*N*N*ddim*sigma*sigma)
請注意,在我的機器(Debian 9)上,/tmp 是填充的位置。 如果您發現必須使用磁盤,請確保使用的磁盤位置有足夠的可用空間,通常 /tmp 不是一個大分區。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.