我正在追踪内存不足的错误,惊讶地发现即使我没有使用大型数组,Python的多进程似乎也会复制它们。我在Linux上使用时,为什么会这样呢?我以为写时复制机制能保护我免受额外的复制。我猜想每当我引用对象时都会触发某种陷阱,然后才进行复制。
对于像30GB自定义字典这样任意数据类型的问题,解决这个问题的正确方法是使用一个
对于像30GB自定义字典这样任意数据类型的问题,解决这个问题的正确方法是使用一个
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
florp
传递任何东西! - Mikhailmalloc()
大量内存,调用fork()
并查看发生了什么?尝试不同的启动方法:'forkserver'或'spawn'。相关:如何避免使用子进程模块导致的[Errno 12]无法分配内存错误。查看这个代码示例和这个答案。 - jfs