gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:17:47 25 4
gpt4 key购买 nike

我正在使用 Python 的多处理函数在具有大约 500GB RAM 的机器上并行运行我的代码。为了在不同的工作人员之间共享一些数组,我创建了一个 Array目的:

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 中而不将其写入硬盘吗?或者我可以更改写入此阵列的硬盘吗?

  • 编辑 :我在网上找到了一些建议,该数组存储在“共享内存”中。但是 /dev/shm设备有更多的可用空间,因为 /dev/sda1由上面的代码填充。
    Here是此代码的(相关部分)strace 日志。

    编辑 #2 : 我想我已经找到了解决这个问题的方法。通过查看来源,我发现 multiprocessing尝试在由使用确定的目录中创建一个临时文件
    process.current_process()._config.get('tempdir')

    在脚本开始时手动设置此值
    from multiprocessing import process
    process.current_process()._config['tempdir'] = '/data/tmp/'

    似乎正在解决这个问题。但我认为这不是解决问题的最佳方法。那么:还有其他建议如何处理吗?

    最佳答案

    这些数据大于 500GB。刚刚shared_data_base通过 sys.getsizeof() 在我的机器上将是 826.2GB和 1506.6GB 来自 pympler.asizeof.asizeof() .即使它们只有 500GB,您的机器也需要一些内存才能运行。这就是为什么数据要写入磁盘的原因。

    import ctypes
    from pympler.asizeof import asizeof
    import sys


    N = 150
    ndata = 10000
    sigma = 3
    ddim = 3
    print(sys.getsizeof(ctypes.c_double(1.0)) * ndata*N*N*ddim*sigma*sigma)
    print(asizeof(ctypes.c_double(1.0)) * ndata*N*N*ddim*sigma*sigma)
    请注意,在我的机器(Debian 9)上,/tmp 是填充的位置。如果您发现必须使用磁盘,请确保使用的磁盘位置有足够的可用空间,通常/tmp 不是一个大分区。

    关于python - 在共享内存中使用 Multiprocessing.Array 时没有剩余空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43573500/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com