我正在运行一个程序,首先将 20 GB 数据加载到内存中。然后我将执行 N(> 1000)个独立任务,其中每个任务都可能使用(只读)20 GB 数据的一部分。我现在正尝试通过多处理来完成这些任务。然而,作为this answer说,为每个进程复制整个全局变量。就我而言,我没有足够的内存来执行超过 4 个任务,因为我的内存只有 96 GB。我想知道是否有解决此类问题的方法,以便我可以充分利用所有内核而不会消耗太多内存。
最佳答案
在 Linux 中, fork 进程具有父地址空间的写时复制 View 。 forking 是轻量级的,同一个程序在父进程和子进程中都运行,除了子进程采用不同的执行路径。作为一个小例子,
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)
结果在
parent: 22642 unchanged
child: 22643 unchanged
22643 changed
22642 unchanged
将其应用于多处理,在此示例中,我将数据加载到全局变量中。由于 python 对发送到进程池的数据进行 pickle,我确保它 pickle 像索引这样的小东西,并让 worker 自己获取全局数据。
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)
Windows 没有用于运行程序的 fork-and-exec 模型。它必须启动一个新的 python 解释器实例,并将所有相关数据克隆给 child 。这是一项繁重的工作!
关于python - 多处理全局变量内存复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40221868/