虽然脚本确实使用了相当多的内存,即使使用“较小”的示例值,答案也是如此

Does Python clone my entire environment each time the parallel

processes are run, including the variables not required by f()? How

can I prevent this behaviour?

它是以某种方式克隆环境与forking一个新进程,但如果copy-on-write语义可用,在写入之前不需要复制实际的物理内存.例如在这个系统上

% uname -a

Linux mypc 4.2.0-27-generic #32-Ubuntu SMP Fri Jan 22 04:49:08 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

COW似乎可以使用,但在其他系统上可能并非如此.在Windows上,这是完全不同的,因为从.exe而不是forking执行新的Python解释器.既然你提到使用htop,你就会使用UNIX或UNIX之类的系统,并获得COW语义.

For each iteration of the for loop the processes in simulation() each

have a memory usage equal to the total memory used by my code.

生成的进程将显示几乎相同的值RSS,但这可能会产生误导,因为如果不发生写操作,它们大多会占用映射到多个进程的相同实际物理内存.在Pool.map中,故事有点复杂,因为它“将可迭代的内容划分为多个块,并将其作为单独的任务提交给进程池”.此提交在IPC进行,提交的数据将被复制.在您的示例中,IPC和2 ** 20函数调用也支配CPU使用率.在模拟中用单个矢量化乘法替换映射使得该机器上的脚本运行时间从大约150s到0.66s.

我们可以通过(某种程度上)简化的示例来观察COW,该示例分配一个大型数组并将其传递给生成的进程以进行只读处理:

import numpy as np

from multiprocessing import Process, Condition, Event

from time import sleep

import psutil

def read_arr(arr, done, stop):

with done:

S = np.sum(arr)

print(S)

done.notify()

while not stop.is_set():

sleep(1)

def main():

# Create a large array

print('Available before A (MiB):', psutil.virtual_memory().available / 1024 ** 2)

input("Press Enter...")

A = np.random.random(2**28)

print('Available before Process (MiB):', psutil.virtual_memory().available / 1024 ** 2)

input("Press Enter...")

done = Condition()

stop = Event()

p = Process(target=read_arr, args=(A, done, stop))

with done:

p.start()

done.wait()

print('Available with Process (MiB):', psutil.virtual_memory().available / 1024 ** 2)

input("Press Enter...")

stop.set()

p.join()

if __name__ == '__main__':

main()

本机输出:

% python3 test.py

Available before A (MiB): 7779.25

Press Enter...

Available before Process (MiB): 5726.125

Press Enter...

134221579.355

Available with Process (MiB): 5720.79296875

Press Enter...

现在,如果我们用一个修改数组的函数替换函数read_arr:

def mutate_arr(arr, done, stop):

with done:

arr[::4096] = 1

S = np.sum(arr)

print(S)

done.notify()

while not stop.is_set():

sleep(1)

结果完全不同:

Available before A (MiB): 7626.12109375

Press Enter...

Available before Process (MiB): 5571.82421875

Press Enter...

134247509.654

Available with Process (MiB): 3518.453125

Press Enter...

for循环在每次迭代后确实需要更多内存,但这显而易见:它从映射中堆叠total_results,因此它必须为新数组分配空间以保存旧结果和新结果以及释放现在未使用的数组旧的结果.

python执行循环内存变大_python – 为什么我的循环在每次迭代时需要更多内存?...相关推荐

  1. 鸿蒙系统升级后内存变小了,鸿蒙升级第一夜服务器崩了,有人等到凌晨3点,称升级后内存变大...

    原标题:鸿蒙升级第一夜服务器崩了,有人等到凌晨3点,称升级后内存变大 6月2日晚间,华为宣布推出HarmonyOS 2,华为"百"款设备将陆续启动HarmonyOS 2升级,不少华 ...

  2. python读取视频占用内存太大_Python 读取大文件内存占用检测示例

    导读热词对python这个高级语言感兴趣的小伙伴,下面一起跟随编程之家 jb51.cc的小编两巴掌来看看吧! python读写文件的api都很简单,一不留神就容易踩"坑".笔者记录 ...

  3. python 循环语句结果存储_Python条件语句和循环语句

    前言 通常都听到别人说,计算机很牛逼,很聪明,其实计算机一点都不聪明,光是你要跟他沟通,都会气 shi 你,聪明的是在写程序的你. 写程序就是跟计算机沟通,告诉它要做什么. 竟然是这样,那么肯定缺少不 ...

  4. 「ImageProcess」mp4视频转存图片内存变大的原因探究

    记录: 做CV因为要处理视频,将mp4格式视频中的每一帧都作为图片保存了下来,发现保存后图片所占内存(500M+)远远大于视频本身(30M+),原因不明 对每帧图片做直方图均衡后,保存的结果所占内存更 ...

  5. python执行linux命令返回结果_python执行linux命令的简单示例

    对python执行linux命令的两种方法感兴趣的小伙伴,下面一起跟随编程之家 jb51.cc的小编两巴掌来看看吧! python执行linux命令有两种方法: 在此以Linux常用的ls命令为例: ...

  6. TF卡里删掉文件后内存没变大_不用第三方,手机自带软件也能清扫内存!教你4个清理技巧...

    手机使用一两年后,难免会堆积了很多文件占用手机内存,今天花部长就来给大家发干货,教你如何正确地清理内存和缓存,让手机运行恢复流畅. 1.手机管家,一键清理 大家应该都知道,清理内存最直接的方法就是打开 ...

  7. TF卡里删掉文件后内存没变大_不用第三方,手机自带软件也能清扫内存!教你4个正确清理技巧...

    手机使用一两年后,难免会堆积了很多文件占用手机内存,今天花部长就来给大家发干货,教你如何正确地清理内存和缓存,让手机运行恢复流畅. 1.手机管家,一键清理 大家应该都知道,清理内存最直接的方法就是打开 ...

  8. mysqlfor循环中出错继续_Python学习笔记(循环)

    循环语句 1. while 循环 while语句最基本的形式包括一个位于顶部的布尔表达式,一个或多个属于while代码块的缩进语句. while 布尔表达式:代码块 while循环的代码块会一直循环执 ...

  9. python计算区间内偶数和_Python 计算当真因子个数为偶数个时为幸运数,计算区间内幸运数之和...

    晚饭后朋友发来个问题,正好无事做,动手写了一下 若一个正整数有偶数个不同的真因子,则称该数为幸运数.如4含有2个真因子为 1 和 2 .故4是幸运数.求[2,100]之间的全部幸运数之和. 常规思路 ...

最新文章

  1. 怎么用计算机不会卡,电脑卡顿不流畅怎么解决?
  2. 代码详解 | 用Pytorch训练快速神经网络的9个技巧
  3. 【Android 逆向】Android 系统文件分析 ( cpuinfo 处理器信息文件 | self 当前进程信息文件 | meminfo 当前内存信息文件 )
  4. css盒子模型圆形运用,【前端】CSS3学习笔记(三)——盒子模型
  5. 完全背包——方案个数 UVA11137 Ingenuous Cubrency
  6. java 导出文件上传模板,上传Excel文件批量导入数据
  7. php跟安卓交互,android客户端跟php服务简单交互
  8. 2022年医院三基考试药师(中医临床)考试模拟试题卷及答案
  9. shell小脚本--laod博客更新hosts文件[脚本]
  10. 计蒜客_Lpl and Energy-saving Lamps_线段树
  11. PV,VG,LV的关系和操作
  12. 记一次微信小程序canvas 2d 生成海报问题
  13. 最全最精准的IE浏览器判断和国内套壳浏览器判断(360,QQ,搜狗,百度等)
  14. Android--语音识别
  15. 支付宝单笔转账到支付宝账户(用于分成或者退款)
  16. 计算机组成:中断向量的相关计算
  17. 小程序「Github开源社区」
  18. android 音乐播放器专辑图片旋转,Android应用开发之简易、大气音乐播放器实现专辑倒影效果...
  19. 最新绝地求生服务器中文版,绝地求生正式版本服务器翻译最新 | 手游网游页游攻略大全...
  20. alignment fault

热门文章

  1. java collection源码_jdk源码阅读Collection实例分析
  2. 目录:关于【稳定性建设之道】大纲速览
  3. led linux定时闪烁心跳,Linux驱动——LED闪烁
  4. 是什么平台_什么是高空作业平台?
  5. 小熊派折叠开发板Docker编译烧录安装HAP
  6. python对比柱状图_python 绘制分组对比柱状图
  7. LGBM模型取消打印日志(关闭日志)
  8. 机器学习集成模型学习——Bagging集成学习(三)
  9. 解决centos sudo执行仍旧显示Permission denied
  10. python取两个set的并集、交集、差集