[英]Force multiprocessing.Array to be created in memory instead of on disk
[英]multiprocessing.Array allocation in memory
我正在創建一個 multiprocessing.Array 並使用htop檢查它在內存中的大小。 此外,我正在查看訪問數組的最后一個元素需要多長時間。
import multiprocessing as mp
import numpy as np
import time
X = 1 # 1 GB
mp_array = mp.Array('B', X*1024*1024*1024, lock = True)
np_array = np.frombuffer(mp_array.get_obj(), dtype = 'B')
t1 = time.time()
for i1 in range(10**7):
a = np_array[-1]
print(time.time() - t1)
當我創建一個“小”數組時,我在htop 中看到內存如何增加 1 GB,如果大小為 3 或 6 GB,則相同,因此所有數組都進入正在使用的內存(綠色)。 我的電腦上有 32 GB,所以我嘗試創建一個 20GB 的數組,但是當我這樣做時,我看到綠色內存與創建數組之前的值相同,並且所有這些都轉到黃色內存(緩存,我讀過的)。 我什至嘗試創建一個比我的總 RAM 還大的數組,它奏效了。 所以我真的不知道后台發生了什么(不使用交換)。 每種情況下的時間基本相同,循環大約需要 1.5 秒
現在,這只是測試,對於我正在處理的程序,我在一台 8 GB 的機器中創建了六個獨立的共享內存陣列,每個 X GB。 (僅用於上下文:每個數組都是相機流的緩沖區)
我嘗試使用 X = 0.5,所以總共應該使用 3 GB,它按預期工作,但是當我使用 X = 1 時,它的一小部分會進入緩存。 我猜前幾個數組分配在“活動”內存中,其余的分配到緩存中? 在我的粗略測試中,訪問任何類型的內存時都沒有發現時間差異。 但我真的不明白這里發生了什么,也不明白為什么我可以創建一個比我的總 RAM 大的數組。
你能給我任何見解嗎?
sharedctypes
從稱為“Arena”的塊中分配內存,這些塊是內存映射文件。 盡最大努力從非存儲支持的目錄(您的 fs 的一部分僅在 ram 中...)創建所述文件以獲得最佳性能。 但是,在創建文件之前會檢查可用空間,因此如果內存中的臨時文件夾中沒有空間,則可能會在駐留在磁盤上的其他位置創建臨時文件。 然后緩沖區最終被視為 mmap 的內存視圖:
多處理/heap.py
else: #if sys.platform != 'win32':
class Arena(object):
"""
A shared memory area backed by a temporary file (POSIX).
"""
if sys.platform == 'linux':
_dir_candidates = ['/dev/shm']
else:
_dir_candidates = []
def __init__(self, size, fd=-1):
self.size = size
self.fd = fd
if fd == -1:
# Arena is created anew (if fd != -1, it means we're coming
# from rebuild_arena() below)
self.fd, name = tempfile.mkstemp(
prefix='pym-%d-'%os.getpid(),
dir=self._choose_dir(size))
os.unlink(name)
util.Finalize(self, os.close, (self.fd,))
os.ftruncate(self.fd, size)
self.buffer = mmap.mmap(self.fd, self.size)
def _choose_dir(self, size):
# Choose a non-storage backed directory if possible,
# to improve performance
for d in self._dir_candidates:
st = os.statvfs(d)
if st.f_bavail * st.f_frsize >= size: # enough free space?
return d
return util.get_temp_dir()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.