创建共享内存Numpy ndarray,无需内存复制

lam*_*ung 5 numpy shared-memory multiprocessing python-3.8

I\xe2\x80\x99m 尝试创建 Numpy 数组,该数组可以被同一台机器上的其他进程极快地访问。经过大量研究和测试,我决定尝试使用 Python 3.8 共享内存来实现这一目标,希望使用共享内存可以允许以亚毫秒的速度在进程之间共享大型 numpy 数组。

\n

实现将是这样的:

\n
    \n
  • 在第一个 ipython shell 上(在第一个进程上):
  • \n
\n
import time\nimport numpy as np\nfrom multiprocessing.shared_memory import SharedMemory\n\narr = np.random.randint(0, 255, (5000, 5000, 4), dtype=np.uint8)\nshm = SharedMemory(create=True, size=arr.nbytes)\n\nshm_arr = np.ndarray(arr.shape, dtype=arr.dtype, buffer=shm.buf)\nshm_arr[:] = arr[:]\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • 在第二个 ipython shell 上(在第二个进程上):
  • \n
\n
import numpy as np\nimport time\nfrom multiprocessing.shared_memory import SharedMemory\n\nshm = SharedMemory(name=\'test\')\nshm_arr = np.ndarray([5000, 5000, 4], dtype=np.uint8, buffer=shm.buf)\nshm.close()\n
Run Code Online (Sandbox Code Playgroud)\n

但这里有一个瓶颈。为了在第一个进程上创建共享 numpy 数组,我需要使用:

\n
shm_arr[:] = arr[:]\n
Run Code Online (Sandbox Code Playgroud)\n

这意味着有一个从arr到 的内存复制操作shm_arr。对于大型阵列,这可能需要很多时间。例如,上面的5000 x 5000 x 4数组仅用于该赋值调用55 ms。在我的测试中,这使得整个过程仅比使用 pickle at max 序列化整个数组快 20%。另一方面,重建时间约为 5 毫秒,仍然不是亚毫秒级。

\n

问题:

\n
    \n
  • 我\xe2\x80\x99m 在这里做错了什么吗?
  • \n
  • 有没有什么方法可以在第一个进程上创建共享 numpy 数组而无需内存复制,因此速度会更快?
  • \n
\n

感谢您检查。

\n