gpt4 book ai didi

python - 多处理模块显示与主进程相同的每个子进程的内存。

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:30:49 25 4
gpt4 key购买 nike

我正在使用 python 的多处理模块,对此有一些困惑。

基本上,我最初在主进程中存储了一些数据,如 top 命令所示,大约为 16GB(主内存大小)。我已将这些数据存储为全局变量。

然后对这些数据进行多处理,并相应地进行不同的处理。

现在我看到多处理正在发生,即所有进程都有自己的 CPU 使用率,但所有进程的内存每个都是 16 GB ..为什么会这样。??难道它不应该使用我通过引用传递全局变量发送的相同内存吗?请思考一下。

top命令的输出结果如下:-

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 13908 admin 20 0 16.7g 16g 848 R 100.0 17.3 0:32.92 python
13429 admin 20 0 16.7g 16g 3336 S 0.0 17.3 15:06.97 python
13910 admin 20 0 16.7g 16g 848 R 100.3 17.3 0:32.94 python
13911 admin 20 0 16.7g 16g 840 R 100.0 17.3 0:33.02 python
13912 admin 20 0 16.7g 16g 836 R 99.6 17.3 0:33.00 python
13907 admin 20 0 16.7g 16g 796 R 100.0 17.3 0:33.06 python
13909 admin 20 0 16.7g 16g 796 R 99.6 17.3 0:32.93 python

最佳答案

multiprocessing 模块产生的每个进程都在一个单独的地址空间中。在创建新进程后,原始进程拥有的所有物理和虚拟内存至少逻辑上独立于新进程,但最初每个新进程都是老的。因此,每个都将具有与原始文件相同的虚拟大小 (16.7 GB)。

实际的底层物理页面尽可能共享,使用“写时复制”。当各种副本运行并对它们的虚拟内存进行更改时,内核将根据需要复制底层物理页面。从未写入的内存可以在所有副本之间共享。因此,尽管每个进程似乎都在消耗大量 RAM,但实际上并非如此。但是,如果您写入其中的大部分——即,如果每个单独的进程更改 16 GB 数据中的大部分——那么它们都将拥有单独的副本,并使用更多的物理 RAM。

multiprocessing 模块确实提供了一些共享数据的方法(请参阅 http://docs.python.org/library/multiprocessing.html 中的“共享内存”部分)如果您希望它们共享修改(但请考虑锁定的工作原理;请参阅文档)。


脚注:在 fork 或克隆系统调用之后,原始版本和克隆版本之间有一个微小的区别:原始版本取回克隆版本的 ID,而克隆版本取回数字零。

关于python - 多处理模块显示与主进程相同的每个子进程的内存。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10369219/

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