War*_*ren 4 python memory multiprocessing
我正在运行一个程序,该程序首先将20 GB数据加载到内存中。然后,我将执行N(> 1000)个独立的任务,其中每个任务都可能使用(只读)20 GB数据的一部分。我现在正在尝试通过多处理来完成那些任务。但是,正如这个答案所说,每个过程都复制了整个全局变量。就我而言,我的内存不足以执行4个以上的任务,因为我的内存仅为96 GB。我想知道是否有解决此类问题的方法,以便我可以充分利用我的所有内核而不会占用太多内存。
在linux中,分叉的进程具有父地址空间的写时复制视图。分叉是轻量级的,并且相同的程序在父级和子级中都可以运行,只是子级采用不同的执行路径。作为一个小例子,
import os
var = "unchanged"
pid = os.fork()
if pid:
print('parent:', os.getpid(), var)
os.waitpid(pid, 0)
else:
print('child:', os.getpid(), var)
var = "changed"
# show parent and child views
print(os.getpid(), var)
Run Code Online (Sandbox Code Playgroud)
结果是
parent: 22642 unchanged
child: 22643 unchanged
22643 changed
22642 unchanged
Run Code Online (Sandbox Code Playgroud)
将其应用于多处理,在此示例中,我将数据加载到全局变量中。由于python腌制发送到进程池的数据,因此我确保它腌制诸如索引之类的小东西,并让工作人员获取全局数据本身。
import multiprocessing as mp
import os
my_big_data = "well, bigger than this"
def worker(index):
"""get char in big data"""
return my_big_data[index]
if __name__ == "__main__":
pool = mp.Pool(os.cpu_count())
for c in pool.imap_unordered(worker, range(len(my_big_data)), chunksize=1):
print(c)
Run Code Online (Sandbox Code Playgroud)
Windows没有运行程序的分叉执行模型。它必须启动python解释器的新实例,并将所有相关数据克隆到子级。这是一个沉重的负担!
| 归档时间: |
|
| 查看次数: |
2947 次 |
| 最近记录: |