写入共享内存中的 numpy 数组失败超过特定大小阈值,但仅限于 IDE 中

问题描述 投票:0回答:1

我正在尝试实现一个共享的 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")
python numpy shared-memory multiprocess
1个回答
0
投票

您已经提到您正在运行容器化的Python环境,并且共享内存的默认容器限制是64M。

要增加它,请尝试在 docker compose 文件中增加

shm_size
参数

© www.soinside.com 2019 - 2024. All rights reserved.