簡體   English   中英

在共享內存中使用 Multiprocessing.Array 時沒有剩余空間

[英]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

現在我有兩個問題:

  1. 為什么這段代碼甚至會向光盤寫入任何內容? 為什么不全部存儲在內存中?
  2. 我怎么解決這個問題? 我可以讓 Python 將它完全存儲在 RAM 中而不將其寫入硬盤嗎? 或者我可以更改寫入此陣列的硬盤嗎?

編輯:我在網上找到了一些建議,該數組存儲在“共享內存”中。 但是/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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM