Python 在共享内存中使用Multiprocessing.Array时没有剩余空间
我正在使用Python的多处理函数在一台内存约为500GB的机器上并行运行代码。要在不同的工作人员之间共享一些数组,我正在创建一个Python 在共享内存中使用Multiprocessing.Array时没有剩余空间,python,arrays,multiprocessing,python-multiprocessing,Python,Arrays,Multiprocessing,Python Multiprocessing,我正在使用Python的多处理函数在一台内存约为500GB的机器上并行运行代码。要在不同的工作人员之间共享一些数组,我正在创建一个数组对象: N = 150 ndata = 10000 sigma = 3 ddim = 3 shared_data_base = multiprocessing.Array(ctypes.c_double, ndata*N*N*ddim*sigma*sigma) shared_data = np.ctypeslib.as_array(shared_data_bas
数组
对象:
N = 150
ndata = 10000
sigma = 3
ddim = 3
shared_data_base = multiprocessing.Array(ctypes.c_double, ndata*N*N*ddim*sigma*sigma)
shared_data = np.ctypeslib.as_array(shared_data_base.get_obj())
shared_data = shared_data.reshape(-1, N, N, ddim*sigma*sigma)
这对于sigma=1
来说非常有效,但是对于sigma=3
来说,设备的一个硬盘驱动器被慢慢填满,直到不再有可用空间,然后该过程失败,出现以下异常:
OSError: [Errno 28] No space left on device
现在我有两个问题:
/dev/shm
设备与上面的代码填充的/dev/sda1
相比有更多的可用空间。
是该代码的(相关部分)战略日志
编辑2:我想我已经找到了解决这个问题的方法。通过查看源代码,我发现,multiprocessing
试图在一个目录中创建一个临时文件,该目录由
process.current_process()._config.get('tempdir')
在脚本开始时手动设置此值
from multiprocessing import process
process.current_process()._config['tempdir'] = '/data/tmp/'
似乎正在解决这个问题。但我认为这并不是解决问题的最好办法。那么:还有其他建议吗?这些数据大于500GB。只要
shared\u data\u base
就可以在我的机器上通过sys.getsizeof()
获得826.2GB的数据,通过pympler.asizeof.asizeof()获得1506.6GB的数据。即使它们只有500GB,您的机器也需要一些内存才能运行。这就是为什么数据会被存储到磁盘上
导入ctypes
来自Pypler.asizeof import-asizeof
导入系统
N=150
数据=10000
西格玛=3
ddim=3
打印(sys.getsizeof(ctypes.c_double(1.0))*nda*N*N*ddim*sigma*sigma)
打印(asizeof(ctypes.c_double(1.0))*nDa*N*N*ddim*sigma*sigma)
请注意,在我的机器(Debian 9)上,/tmp是填充的位置。如果您发现必须使用磁盘,请确保所用磁盘上的位置有足够的可用空间,通常/tmp不是一个大分区。在strace
下运行它以查看发生了什么。顺便问一下,哪里可以获得500G RAM?:)错误代码也可能是错误的。真正意义上的记忆。即。python库滥用了该代码。我猜multiprocessing.Array()
使用/dev/shm
,这(至少在Linux上)限制在可用RAM的一半(请使用df-kh/dev/shm
)。看看如何增加它(如果这是限制因素)。你确定sizeof(c_double)*nda*N*N*ddim*sigma*sigma
适合你的RAM吗?