当分配大量共享内存(总 128GiB RAM 的 60%,使用了 3GiB)时,几秒钟后我收到“总线错误(核心转储)”,并且内存使用量上升。但如果我分配普通内存(在
b()
中),它就可以正常工作。
from multiprocessing.managers import SharedMemoryManager
import numpy as np
SIZE = 70462337280 # Exact size is not quite important
def spin():
import time
while True:
time.sleep(60)
def a():
with SharedMemoryManager() as smm:
shm = smm.SharedMemory(size=SIZE)
buf = np.ndarray((SIZE,), dtype=np.uint8, buffer=shm.buf)
buf.fill(0)
print("Done")
spin()
def b():
buf = np.empty((SIZE,), dtype=np.uint8)
buf.fill(0)
print("Done")
spin()
# Bus error (core dumped)
a()
# Works fine
# b()
我检查了
/proc/sys/kernel/shmmax
,但这似乎没有限制。
cat /proc/sys/kernel/shmmax
18446744073692774399
事实证明,
/dev/shm
是一个默认大小限制为总RAM 50%的tmpfs
(可以通过findmnt -o AVAIL,USED /dev/shm
检查)。当空间用完时,会升起一个BUS ERROR
。
这可以通过修改挂载选项来解决。有关详细信息,请查看 https://help.ubuntu.com/community/StricterDefaults 中的共享内存部分。