gpt4 book ai didi

python - 如果我不触摸它,为什么多处理会复制我的数据?

转载 作者:行者123 更新时间:2023-11-28 17:35:33 24 4
gpt4 key购买 nike

我正在追踪一个内存不足的错误,并且惊恐地发现 python 的多处理似乎复制大型数组,即使我无意使用它们。

为什么 python(在 Linux 上)这样做,我认为写时复制会保护我免受任何额外的复制?我想,每当我引用该对象时,都会调用某种陷阱,然后才进行复制。

对于任意数据类型(例如 30 GB 的自定义字典),使用 Monitor 解决此问题的正确方法是什么?有没有什么方法可以构建 Python,使其不存在这些废话?

import numpy as np
import psutil
from multiprocessing import Process
mem=psutil.virtual_memory()
large_amount=int(0.75*mem.available)

def florp():
print("florp")

def bigdata():
return np.ones(large_amount,dtype=np.int8)

if __name__=='__main__':
foo=bigdata()#Allocated 0.75 of the ram, no problems
p=Process(target=florp)
p.start()#Out of memory because bigdata is copied?
print("Wow")
p.join()

运行:

[ebuild   R    ] dev-lang/python-3.4.1:3.4::gentoo  USE="gdbm ipv6 ncurses readline ssl threads xml -build -examples -hardened -sqlite -tk -wininst" 0 KiB

最佳答案

我预料到这种行为——当您将代码传递给 Python 进行编译时,任何不受函数或对象保护的内容都会立即被执行以进行评估。

在您的情况下,bigdata=np.ones(large_amount,dtype=np.int8) 必须进行评估——除非您的实际代码具有不同的行为,florp() 未被调用与它无关。

查看直接示例:

>>> f = 0/0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
>>> def f():
... return 0/0
...
>>>

要将此应用于您的代码,请将 bigdata=np.ones(large_amount,dtype=np.int8) 放在函数后面并根据需要调用它,否则,Python 会尝试让该变量在运行时对您可用非常有用。

如果 bigdata 没有改变,您可以编写一个函数来获取或设置您在整个过程中保留的对象。

编辑:咖啡刚刚开始工作。当你创建一个新进程时,Python 需要将所有对象复制到新进程中以供访问。您可以通过使用线程或允许您在进程之间共享内存的机制来避免这种情况,例如 shared memory maps或共享 ctypes

关于python - 如果我不触摸它,为什么多处理会复制我的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30963650/

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