我正在尝试实现一个共享的 numpy 数组以用于多处理。它在较小的数组上运行良好,但当我尝试使用 ~2.7GB numpy 数组(约 5.6Mx64 矩阵)时失败。经过一番修改,我发现将输入矩阵写入分配的共享内存时会发生错误,例如如果
dst
是缓冲的 numpy 数组,test_matrix
是正在复制的大矩阵,则 dst[:] = test_matrix[:]
会抛出以下系统错误:Process finished with exit code 135 (interrupted by signal 7:SIGBUS)
。
现在事情变得奇怪了。上面是一个容器化的 python 解释器。使用系统解释器或venv,仍然会崩溃,但是代码
139 11:SIGSEGV
。更奇怪的是,如果您直接在解释器中逐行运行下面的示例,或者在命令行运行脚本,它工作得很好(在解释器中您甚至可以检查复制的矩阵dst
,一切都是正常)。
作为对照,我也尝试在 VSCode 中运行它,也导致崩溃。那么此时我认为可能与IDE有关?欢迎任何见解。
这是一个最小的示例,成功写入 100k 行,然后抛出 100 万行错误。这是在 Ubuntu 22.04、Pycharm Professional 2024.1 中运行的,使用容器化的 Python 3.10.12 系统解释器(无 venv)、本地 venv 和本地系统解释器,结果如上所述。
from multiprocessing import shared_memory
import numpy as np
np.random.seed(42)
# With 100,000 rows.
n = 100000
test_matrix = np.random.randn(n, 64)
d_size = np.dtype(test_matrix.dtype).itemsize * np.prod(test_matrix.shape)
shm = shared_memory.SharedMemory(create=True, size=d_size, name='test_shared_matrix')
# numpy array on shared memory buffer
dst = np.ndarray(shape=test_matrix.shape, dtype=test_matrix.dtype, buffer=shm.buf)
dst[:] = test_matrix[:]
shm.close()
shm.unlink()
# 7: SIGBUS failure With 1,000,000 Rows
n = 1000000
test_matrix = np.random.randn(n, 64)
d_size = np.dtype(test_matrix.dtype).itemsize * np.prod(test_matrix.shape)
shm = shared_memory.SharedMemory(create=True, size=d_size, name='test_shared_matrix')
# numpy array on shared memory buffer
dst = np.ndarray(shape=test_matrix.shape, dtype=test_matrix.dtype, buffer=shm.buf)
dst[:] = test_matrix[:]
shm.close()
shm.unlink()
print("I finished")