Python 在共享内存中使用Multiprocessing.Array时没有剩余空间

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

我正在使用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_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
现在我有两个问题:

  • 为什么这段代码甚至会向光盘写入任何内容?为什么不全部存储在内存中
  • 我怎样才能解决这个问题?我可以让Python将其完整地存储在RAM中,而不将其写入HDD吗?或者我可以更改写入此阵列的HDD吗
  • 编辑:我在网上找到一个提示,数组存储在“共享内存”中。但是
    /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吗?