2020-08-14 08:28:32 登录注册 RSS

当前位置: 公理网 >> 投诉不良 >> Python读取大文件与内存占用检测(常用的分步调试pdb)

Python读取大文件与内存占用检测(常用的分步调试pdb)
发布时间:02-14| 来源:公理网 | 点击发表评论
大文件读取问题
顺便记录一下vim的配置:https://blog.csdn.net/sinat_33741547/article/details/74781591


78475705">https://blog.csdn.net/zwbill/article/details/78475705


这个很简单但是这里重复写一下,主要是记录一下后面的内存检测和分部调试!!!

1.read()与readlines():

codes.open参考地址:80946152">https://blog.csdn.net/weay/article/details/80946152


随手搜索python读写文件的教程,很经常看到read()与readlines()这对函数。所以我们会常常看到如下代码:



withopen(file_path,'rb')asf:
sha1Obj.update(f.read())

or



withopen(file_path,'rb')asf:
forlineinf.readlines():
print(line)

这对方法在读取小文件时确实不会产生什么异常,但是一旦读取大文件,很容易会产生MemoryError,也就是内存溢出的问题。


####WhyMemoryError?

我们首先来看看这两个方法:


当默认参数size=-1时,read方法会读取直到EOF,当文件大小大于可用内存时,自然会发生内存溢出的错误。
8552201-0d33fadfa93063eb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240"/>


同样的,readlines会构造一个list。list而不是iter,所以所有的内容都会保存在内存之上,同样也会发生内存溢出的错误。
8552201-d95d81dbbd19f785.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240"/>

2.正确的用法:

在实际运行的系统之中如果写出上述代码是十分危险的,这种”坑“十分隐蔽。所以接下来我们来了解一下正确用,正确的用法也很简单,依照API之中对函数的描述来进行对应的编码就OK了:


如果是二进制文件推荐用如下这种写法,可以自己指定缓冲区有多少byte。显然缓冲区越大,读取速度越快。



withopen(file_path,'rb')asf:
whileTrue:
buf=f.read(1024)
ifbuf:
sha1Obj.update(buf)
else:
break

而如果是文本文件,则可以用readline方法或直接迭代文件(python这里封装了一个语法糖,二者的内生逻辑一致,不过显然迭代文件的写法更pythonic)每次读取一行,效率是比较低的。笔者简单测试了一下,在3G文件之下,大概性能和前者差了20%.



withopen(file_path,'rb')asf:
whileTrue:
line=f.readline()
ifbuf:
print(line)
else:
break
withopen(file_path,'rb')asf:
forlineinf:
print(line)
内存检测工具:memory_profiler

对于python代码的内存占用问题,对于代码进行内存监控十分必要。这里笔者这里推荐两个小工具来检测python代码的内存占用。


####memory_profiler

首先先用pip安装memory_profiler



pipinstallmemory_profiler

memory_profiler是利用python的装饰器工作的,所以我们需要在进行测试的函数上添加装饰器。



fromhashlibimportsha1
importsys
@profile
defmy_func():
sha1Obj=sha1()
withopen(sys.argv[1],'rb')asf:
whileTrue:
buf=f.read(10*1024*1024)
ifbuf:
sha1Obj.update(buf)
else:
break
print(sha1Obj.hexdigest())


如下图所示,可以看到打印出对应的内存占用数据:
8552201-b04cace85a02dc32.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240"/>


通过上述两种工具guppy与memory_profiler可以很好地来监控python代码运行时的内存占用问题。

内存调试工具:pdb

.单步执行代码,通过命令python-mpdbxxx.py启动脚本,进入单步执行模式


命令参考:


8896744">https://blog.csdn.net/wyb_009/article/details/8896744


8529472.html"rel="nofollow">https://www.cnblogs.com/xiaohai2003ly/p/8529472.html


ipdb参考:


33741547/article/details/74781745">https://blog.csdn.net/sinat_33741547/article/details/74781745


?


运行到目标位置中断程序,出现提示符,进入ipython环境

常用命令


???n(下一步)

???ENTER(重复上次命令)

???c(继续)

???s(进入子程序)

???p变量(打印变量)

???l(当前位置)

???r(运行直到程序结束)

???q(退出)

?


?


授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!

33472765/article/details/81022471"}'target="_blank"href="https://blog.csdn.net/qq_33472765/article/details/81022471">使用Python实现发送带有附件的...
37051141"target="_blank">qq_37051141:你好,请教一个问题,现在想发送一个邮件,正文中包含文本值和附件的html文件,可是现在正文只能放入文本或是附件的html内容,想实现正文开始显示文本内容,下面显示附件中的html内容,该怎么处理一下呢

最新新闻

手机浏览

公理网 版权所有

公理网 Total 0.035120(s) query 6, 报料QQ:点击这里

给我发消息