Ⅰ python 中的out of memory是怎么回事,内存不够吗
这不是你电脑内存大小的问题,
在编程中,如果在一个域中输入的数据超过了它的要求就会引发数据溢出问题。
缓冲区溢出好比是将十磅的糖放进一个只能装五磅的容器里。一旦该容器放满了,余下的部分就溢出在柜台和地板上,弄得一团糟。由于计算机程序的编写者写了一些编码,但是这些编码没有对目的区域或缓冲区——五磅的容器——做适当的检查,看它们是否够大,能否完全装入新的内容——十磅的糖,结果可能造成缓冲区溢出的产生。如果打算被放进新地方的数据不适合,溢得到处都是,该数据也会制造很多麻烦。但是,如果缓冲区仅仅溢出,这只是一个问题。到此时为止,它还没有破坏性。当糖溢出时,柜台被盖住。可以把糖擦掉或用吸尘器吸走,还柜台本来面貌。与之相对的是,当缓冲区溢出时,过剩的信息覆盖的是计算机内存中以前的内容。除非这些被覆盖的内容被保存或能够恢复,否则就会永远丢失。
具体你可以看下边的资料。
Ⅱ Python 多进程内存占用问题
当我们有一个很长很长的任务队列(mission_list)和阈值对应的一个处理函数(missionFunction)时,我们一般采用如下的方式进行处理:
但是,如果这任务列表很长很长,处理函数很复杂(占用cpu)时,单核往往需要很长的时间进行处理,此时,Multiprocess便可以极大的提高我们程序的运行速度,州粗相关内容请借鉴 multiprocessing --- 基于进程的并行 — Python 3.10.4 文档。
以上这种场景下,推荐大家采用最简单的进程池+map的方法进行处理,标准的写法, chunksize要借鉴官方的说法,最好大一点 :
但是!!!! 如果我们的任务列表非常的长,这会导致多进程还没跑起来之前,内存已经撑爆了,任务自然没法完成,此时我们有几种办法进行优化:
进程的启动方法有三种,可参考官方文档:
[图片上传失败...(image-48cd3c-1650511153989)]
在linux环境下,使用forkserver可以节省很多的内存空间, 因为进携迹衡程启动的是一个服务,不会把主进程的数据全部复制
采用imap会极大的节省空间,它返回的是一个迭代器,也就是结果列表:
但注意,以上写法中,你写的结果迭代部分必须写在with下面。或者采用另一种写法:
还有最后一种,当你的mission list实在太大了,导致你在生成 mission list的时候已经把内存撑爆了,这个时候就得优化 mission_list了,如果你的mission_list是通过一个for循环生成的,你可以使用yield字段,将其封装为一个迭代器,传入进程池:
这样子,我们就封装好了mission_list,它是一个可迭代对象,在取数据的辩做时候才会将数据拉到内存
我在项目中结合了后两种方法,原本256G的内存都不够用,但在修改后内存只占用了不到10G。希望能够帮助到你
Ⅲ Python的就业方向有哪些
Python十大就业方向:
1、web开发:Python拥有很多免费数据函数库、免费web网页模板系统、以及与web服务器进行交互的库。可以很好地实现web开发,搭建web框架,比较说diango。
2、桌面软件:用tkinter/PyQT框架开发各种桌面软件
3、网络编程:是Python学习的方向之一,网络编程无处不在。
4、爬虫开发:Python几乎是霸主地位,将网络一切数据作为资源,通过自动化程序进行有针对性的数据采集以及处理。
5、云计算:Python是从事云计算工作需要掌握的一门编程语言,目前非常火热的OpenStack就是由Python开发的。
6、人工智能:Python积累了丰富的科学运算库,Python在众多语言中脱颖而出,各种人工智能算法都是基于Python编写的。
7、自动化运维:Python是综合性语言,可以满足大部分自动化运维需求,前端和后端都可以做。
8、金融分析:金融分析包含金融知识和Python相关模块的学习,包含NumpyPandasScipy数据分析模块等。
9、科学运算:是一门非常适合科学计算的编程语言,Python非常适合做科学计算、绘制高质量的2D和3D图像。
10、游戏开发:游戏开发中,Python也具有非常好的作用,可以用更少的代码描述游戏业务逻辑。
Ⅳ python编写中为什么要使用生成器表达式
就像生成器函数,生成器表达式是一种对内存空间的优化:它们不需要像方括号的列表推导一样,一次构造出整个结果列表。与生成器函数一样,它们将生成结果的过程拆分成更小的时间片:它们会一部分一部分地产生结果,而不是让调用者在一次调用中等待整个集合被创建出来。
另一方面,生成器表达式在实际中运行起来可能比列表推导稍慢一些,所以它们可能只对那些结果集合非常大的运算或者不能等待全部数据产生的应用来说是最优选择。
Ⅳ 电脑技术
第一招:关闭多余程序如果同时打开的文档过多或者运行的程序过多,就没有足够的内存运行其他程序。这时,对于多文档界面程序,如Word、Excel等,请关闭当前文档外的所有文档,并退出当前未使用的程序,或许你就能够继续执行因“内存不足”而被中断的任务。
第二招:清除剪贴板中的内容1.清除系统剪贴板中的内容(存储Windows复制或剪贴内容的剪贴板)点击“开始→程序→附件→系统工具→剪贴板查看程序”,在“编辑”菜单上,单击“删除”命令,系统弹出“清除剪贴板”对话框,单击“是”按钮。2.清除多重剪贴板中的内容(Office程序提供的剪贴板)在“Office剪贴板”任务窗格(OfficeXP)或工具栏(Office2000)上,单击“全部清空”或“清空‘剪贴板’”。当清空“Office剪贴板”时,系统剪贴板也将同时被清空。
第三招:合理设置虚拟内存如果没有设置Windows虚拟内存,那么很容易收到“内存不足”的消息。点击“开始→设置→控制面板”,双击“系统”。在“系统属性”对话框中,单击“性能”选项卡,然后单击“虚拟内存”按钮。选中“让Windows管理虚拟内存设置-(推荐)”选项,将计算机中可作为虚拟内存使用的硬盘空间量设置为默认值。
第四招:增加可用磁盘空间有四种方法可以增加磁盘的使用空间:1.清空回收站。2.删除临时文件。打开%20“我的电脑”,右键单击要释放其空间的磁盘,然后单击“属性”,在“常规”选项卡上,单击“磁盘清理”按钮,选中要删除的不需要的文件前的复选框进行整理。3.从磁盘中删除过期的文件或已存档的文件。4.删除从未使用过的所有文件。
第五招:重新安装已损坏的程序如果仅仅是使用某个程序时,系统提示内存不足,而其他程序可以正常运行,那么可能的原因是该程序文件被毁坏,从而导致内存不足的问题。请尝试删除并重新安装该程序,然后重新运行该程序。如果系统不再提示内存不足,那么说明原程序文件确实被损坏。
第六招:使用内存优化软件内存优化软件有很多,比如RAM%20Idle和Memo%20Kit就比较出色。它们可以设置自动清空剪贴板、释放被关闭程序未释放的内存,从而免除你手工操作的麻烦,达到自动释放内存的目的,不妨一试。
第七招:重新启动计算机如果只退出程序,并不重新启动计算机,程序可能无法将内存资源归还给系统。在运行重要程序之前,请重新启动计算机以充分释放系统资源。
第八招:减少自动运行的程序如果在启动Windows时自动运行的程序太多,那么,即使重新启动计算机,也没足够的内存用来运行其他程序。这时就需要清除一些不必要的系统自启动程序。
点击“开始→运行”,输入msconfig,打开“系统配置实用程序”窗口。单击“一般”选项卡,选中“选择性启动”复选框。去掉%20“处理Win.ini文件”和“加载启动项”前的复选框。打开“启动”选项卡,将不需要开机自动启动的程序都勾除掉就好了。
第九招:查杀病毒系统感染电脑病毒也是导致内存不足的罪魁祸首。当系统出现“内存不足”的错误时,请使用最新的杀毒软件查杀病毒,或许在清除电脑病毒之后,就解决了“内存不足”的问题。
解决“内存不足”的办法9则
一、剪贴板占用了太多的内存
实际上,剪贴板是内存中的一块临时区域,当你在程序中使用了“复制”或“剪切”命令后,Windows将把复制或剪切的内容及其格式等信息暂时存储在剪贴板上,以供“粘贴”使用。如果当前剪贴板中存放的是一幅图画,则剪贴板就占用了不少的内存。这时,请按下述步骤清除剪贴板中的内容,释放其占用的内存资源:
1.单击“开始”,指向“程序”或“所有程序”,指向“附件”,指向“系统工具”,然后单击“剪贴板查看程序”,打开“剪贴板查看程序”窗口。2.在“编辑”菜单上,单击“删除”命令。3.关闭“剪贴板查看程序”窗口。
为了与Microsoft Office程序提供的多重剪贴板相区分,上述所说的剪贴板,常被我们称为系统剪贴板。如果你正在使用Micros OftOffice程序,而且使用了其多重剪贴板功能,那么你应清空“Office剪贴板”上的项目,方法是:在“Office剪贴板”任务窗格(OfficeXP)或工具栏(Office2000)上,单击“全部清空”或“清空‘剪贴板’”。当清空“Office剪贴板”时,系统剪贴板也将同时被清空
二、打开的程序太多
如果同时打开的文档过多或者运行的程序过多,就没有足够的内存运行其他程序。这时,对于多文档界面(MDl)程序,如Word、Excel等,请关闭当前文档外的所有文档,并退出当前未使用的程序,然后或许你就能够继续执行因“内存不足”而被中断的任务。
三、重新启动计算机
如果只退出程序,并不重新启动计算机,程序可能无法将内存资源归还给系统。请重新启动计算机以释放系统资源,然后再次运行程序或执行被中断的任务。
四、自动运行的程序太多
如果在启动Windows时自动运行的程序太多,那么,即使重新启动计算机,也没足够的内存用来运行其它程序。
(一)确定设置为自动运行的程序是否太多
1.单击“开始”,然后单击“运行”。
2.在“打开”框中,键入“Msconfig”,单击“确定”按钮,打开“系统配置实用程序”窗口。
3.单击“常规”选项卡,选中“选择性启动”复选钮,清除“处理Win.ini文件”复选框和“加载启动组项目”复选框。
4.单击“确定”按钮,当系统提示重新启动计算机时,请单击“是”按钮。
重新启动电脑后,如果内存不足的问题已经解决,你就可以将计算机配置为启动时不打开任何程序。
(二)配置计算机不自动打开任何程序
1.恢复在Msconfig中所作的更改,方法是:在“系统配置实用程序”窗口,单击“常规”选项卡,选择“正常启动”,单击“确定”按钮,然后重新启动计算机。
2.删除“启动”文件夹中的所有快捷方式
①单击“开始”,指向“设置”,然后单击“任务栏和开始菜单”,系统弹出“任务栏属性”对话框。
②单击“开始菜单程序”选项卡,单击“删除”按钮。
③单击“启动”文件夹旁的加号,以显示设置为自动运行的程序列表。如果“启动”文件夹旁没有加号“+”,则表明没有设置为自动运行的程序,请单击“关闭”按钮以终止此过程。
④单击“启动”文件夹中的每个快捷方式,然后单击“删除”按钮。此操作将从“开始”菜单中删除快捷方式,但并不从硬盘中删除相应的程序。对于“启动”文件夹中的每个快捷方式,重复该步骤。
⑤单击“关闭”按钮。
⑥单击“确定”按钮。
3.禁用从Win.ini文件加载的所有程序
①如上所述打开“系统配置实用程序”窗口。
②单击“Win.ini”选项卡,双击“[windows]”,然后清除“Load=”和“Run=”复选框。
③单击“确定”按钮,当系统提示重新启动计算机时,请单击“是”按钮。
五、让Windows管理虚拟内存设置
如果没有设置让Windows管理虚拟内存或者禁用虚拟内存,那么计算机可能无法正常工作,也可能收到“内存不足”的消息,或在运行某程序时出现相同的错误消息。
1.单击“开始”,单击“设置”,单击“控制面板”,然后双击“系统”。
2.在“系统属性”对话框中,单击“性能”选项卡,然后单击“虚拟内存”按钮。
3.选中“让Windows管理虚拟内存设置—(推荐)”选项,将计算机中可作为虚拟内存使用的硬盘空间量设置为默认值。此时,虚拟内存分页“win386.swp”能够根据实际内存的使用情况动态缩小和放大,最小容量为0,最大容量为硬盘的全部可用空间。
4.单击“确定”按钮。
六、增加可用磁盘空间
由于Windows以虚拟内存分页文件的格式使用硬盘空间以模拟RAM(),所以,尽管已设置为让Windows管理虚拟内存,但是当虚拟内存分页文件所在的驱动器(默认为Windows系统所在的硬盘分区)没有足够的空间时,仍会出现“内存不足”的错误。此时,请执行以下一项或多项操作,增加Windows虚拟内存分页文件所在驱动器上的可用空间:
1.清空回收站,方法是:在桌面上,右键单击“回收站”,再单击“清空回收站”。
2.从磁盘中删除临时文件,方法是:打开“Windows资源管理器”或“我的电脑”窗口,右键单击要释放其空间的磁盘,然后单击“属性”,在“常规”选项卡上,单击“磁盘清理”按钮,选中要删除的不需要的文件前的复选框(如图3),可以阅读列表下面区域中每个文件类型的说明,单击“确定”按钮。
3.从磁盘中删除过期的文件或已存档的文件。
4.删除从未使用过的所有文件。
七、程序文件被毁坏
如果仅仅是使用某个程序时,系统提示内存不足,而其他程序可以正常运行,那么可能的原因是该程序文件被毁坏,从而导致内存问题。然而Windows并没有确切地提示表明该程序已损坏,所以请尝试删除并重新安装该程序,然后重新运行该程序。如果系统不再提示内存不足,那么说明原程序文件确实被损坏。
八、使用内存优化软件
内存优化软件有很多,比如RAM Idle和Memo Kit就是比较出色的两个。这些软件都可以设置自动清空剪贴板、释放被关闭程序未释放的内存、对Win386.swp文件进行重新组织等,从而免除你手工操作的麻烦,达到自动释放内存的目的,不妨一试!
九、查杀病毒
系统感染电脑病毒也是导致内存不足的罪魁祸首,当系统出现“内存不足”的错误时,请使用最新的防毒软件查杀病毒,或者在清除电脑病毒之后,就解决了“内存不足”的问题。
Windows本身是内存消耗大户,会占用大量的系统资源,如果物理内存不多,经常会因为占用物理内存过多导致提示内存不足。但有时,Windows中的内存不足提示并不一定能准确反映出导致问题的原因。一般来说,Windows系统会在以下几种情况下提示“内存不足”:
第一,用Windows附带的记事本程序拷贝一些网络上的信息,准备汇总后编辑——但是当粘贴了几次后,经常会跳出一个对话框,说“内存不足,***文件无法被保存”。这一提示容易让人误认为是内存出了问题,如果按此提示去查找原因,费时费力也解决不了问题。其实这是记事本程序本身的功能限制和设计的问题,超过64K字节的内容就不能再编辑了。
第二,在浏览网页的时候经常跳出“内存不足”的提示。由于Windows没有详细描述内存、虚拟内存和临时文件缓冲区的不同,所以经常使人误以为是物理内存出现问题。其实在很多时候,这是由于IE属性设置中分配给internet临时文件的磁盘空间的大小不够造成,从而导致脱机浏览的内容无法被保存。要解决这一问题,只要在IE的右键菜单中选择属性,单击“设置”按钮,将Internet临时文件夹中的“使用的磁盘空间”调大一些即可。
第三,在某些情况下, P4机器上安装了主板驱动和其他驱动程序后再安装office2000,在使用office2000时也有一定几率会提示内存不足。这是由于P4主板驱动和office2000存在一些兼容性问题,可以尝试备份数据后重新安装操作系统,然后先安装office2000,再安装主板驱动等其他驱动程序,便可以较好的解决该问题。
第四,很常见的导致“内存不足”提示的原因是因为感染病毒。由于病毒在内存中大量复制,所以造成报错提示。一般杀毒后即可解决该问题。
Ⅵ 如何释放Python占用的内存
在上文的优化中,对每500个用户,会进行一些计算并记录结果在磁盘文件中。原本以为这么做,这些结果就在磁盘文件中了,而不会再继续占用内存;但实际上,python的大坑就是Python不会自动清理这些内存。这是由其本身实现决定的。具体原因网上多有文章介绍,这里就不了。
本篇博客将贴一个笔者的实验脚本,用以说明Python确实存在这么一个不释放内存的现象,另外也提出一个解决方案,即:先del,再显式调用gc.collect(). 脚本和具体效果见下。
实验环境一:Win 7, Python 2.7
[python] view plain
from time import sleep, time
import gc
def mem(way=1):
print time()
for i in range(10000000):
if way == 1:
pass
else: # way 2, 3
del i
print time()
if way == 1 or way == 2:
pass
else: # way 3
gc.collect()
print time()
if __name__ == "__main__":
print "Test way 1: just pass"
mem(way=1)
sleep(20)
print "Test way 2: just del"
mem(way=2)
sleep(20)
print "Test way 3: del, and then gc.collect()"
mem(way=3)
sleep(20)
运行结果如下:
[plain] view plain
Test way 1: just pass
1426688589.47
1426688590.25
1426688590.25
Test way 2: just del
1426688610.25
1426688611.05
1426688611.05
Test way 3: del, and then gc.collect()
1426688631.05
1426688631.85
1426688631.95
对于way 1和way 2,结果是完全一样的,程序内存消耗峰值是326772KB,在sleep 20秒时,内存实时消耗是244820KB;
对于way 3,程序内存消耗峰值同上,但是sleep时内存实时消耗就只有6336KB了。
实验环境二: Ubuntu 14.10, Python 2.7.3
运行结果:
[plain] view plain
Test way 1: just pass
1426689577.46
1426689579.41
1426689579.41
Test way 2: just del
1426689599.43
1426689601.1
1426689601.1
Test way 3: del, and then gc.collect()
1426689621.12
1426689622.8
1426689623.11
[plain] view plain
ubuntu@my_machine:~$ ps -aux | grep test_mem
Warning: bad ps syntax, perhaps a bogus '-'? See
ubuntu 9122 10.0 6.0 270916 245564 pts/1 S+ 14:39 0:03 python test_mem.py
ubuntu 9134 0.0 0.0 8104 924 pts/2 S+ 14:40 0:00 grep --color=auto test_mem
ubuntu@my_machine:~$ ps -aux | grep test_mem
Warning: bad ps syntax, perhaps a bogus '-'? See
ubuntu 9122 10.0 6.0 270916 245564 pts/1 S+ 14:39 0:03 python test_mem.py
ubuntu 9134 0.0 0.0 8104 924 pts/2 S+ 14:40 0:00 grep --color=auto test_mem
ubuntu@my_machine:~$ ps -aux | grep test_mem
Warning: bad ps syntax, perhaps a bogus '-'? See
ubuntu 9122 11.6 0.1 30956 5608 pts/1 S+ 14:39 0:05 python test_mem.py
结论:
以上说明,当调用del时,其实Python并不会真正release内存,而是将其继续放在其内存池中;只有在显式调用gc.collect()时,才会真正release内存。
进一步:
其实回到上一篇博客的脚本中,也让其引入gc.collect(),然后写个监控脚本监测内存消耗情况:
[plain] view plain
while ((1)); do ps -aux | sort -n -k5,6 | grep my_script; free; sleep 5; done
结果发现:内存并不会在每500个用户一组执行完后恢复,而是一直持续消耗到仅存约70MB时,gc才好像起作用。本环境中,机器使用的是Cloud instance,总内存2G,可用内存约为1G,本脚本内存常用消耗是900M - 1G。换句话说,对于这个脚本来说,gc并没有立即起作用,而是在系统可用内存从1 - 1.2G下降到只剩70M左右时,gc才开始发挥作用。这点确实比较奇怪,不知道和该脚本是在Thread中使用的gc.collect()是否有关,或者是gc发挥作用原本就不是可控的。笔者尚未做相关实验,可能在下篇博客中继续探讨。
但是,可以肯定的是,若不使用gc.collect(), 原脚本将会将系统内存耗尽而被杀死。这一点从syslog中可以明显看出。