python - 多处理全局变量内存复制

标签 python memory multiprocessing

我正在运行一个程序,首先将 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/

相关文章:

python - 如何使用 tkinter 创建菜单栏?

python - 如何让 Python 除以 -0.0 和 0.0 分别得到 -Inf 和 Inf?

java - 从容器的实例中删除组件是否保留在内存中?

Python多处理和子进程的独立性

python - 从多处理计算更新 TKinter GUI

python - 在 PySpark 中的 groupby 之后计算 sum 和 countDistinct

python - 使用 pip 安装后找不到 cookiecutter 命令

Git 的内存使用情况

c++ - 如何在WSL 2中读取物理内存?

Python,读取很多文件并合并结果