簡體   English   中英

multiprocessing.Array 在內存中的分配

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

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