python读写文件的api都很简单,一不留神就容易踩”坑“。笔者记录一次踩坑历程,并且给了一些总结,希望到大家在使用python的过程之中,能够避免一些可能产生隐患的代码。

1.read()与readlines():

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

sha1Obj.update(f.read())

orwith open(file_path, 'rb') as f:

for line in f.readlines():

print(line)

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

Why Memory Error?

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

当默认参数size=-1时,read方法会读取直到EOF,当文件大小大于可用内存时,自然会发生内存溢出的错误。

read方法

同样的,readlines会构造一个list。list而不是iter,所以所有的内容都会保存在内存之上,同样也会发生内存溢出的错误。

readlines方法

2.正确的用法:

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

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

while True:

buf = f.read(1024)

if buf:

sha1Obj.update(buf)

else:

break

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

while True:

line = f.readline()

if buf:

print(line)

else:

break

with open(file_path, 'rb') as f:

for line in f:

print(line)

3.内存检测工具的介绍:

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

memory_profiler

首先先用pip安装memory_profilerpip install memory_profiler

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

import sys

@profile

def my_func():

sha1Obj = sha1()

with open(sys.argv[1], 'rb') as f:

while True:

buf = f.read(10 * 1024 * 1024)

if buf:

sha1Obj.update(buf)

else:

break

print(sha1Obj.hexdigest())

if __name__ == '__main__':

my_func()

之后在运行代码时加上** -m memory_profiler**

就可以了解函数每一步代码的内存占用了

依次列出每一步代码的内存占用情况

guppy

依样画葫芦,仍然是通过pip先安装guppypip install guppy

之后可以在代码之中利用guppy直接打印出对应各种python类型(list、tuple、dict等)分别创建了多少对象,占用了多少内存。from guppy import hpy

import sys

def my_func():

mem = hpy()

with open(sys.argv[1], 'rb') as f:

while True:

buf = f.read(10 * 1024 * 1024)

if buf:

print(mem.heap())

else:

break

如下图所示,可以看到打印出对应的内存占用数据:

python代码详细的内存占用情况

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

4.小结:

python是一门崇尚简洁的语言,但是正是因为它的简洁反而更多了许多需要仔细推敲和思考的细节。希望大家在日常工作与学习之中也能多对一些细节进行总结,少踩一些不必要的“坑”。

python读取大文件的坑_Python读取大文件的坑“与内存占用检测相关推荐

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

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

  2. Python读取大文件的坑与内存占用检测

    Python读取大文件的"坑"与内存占用检测 1.read()与readlines() with open(file_path, 'rb') as f:sha1Obj.update ...

  3. Python读取大文件的坑“与内存占用检测

    python读写文件的api都很简单,一不留神就容易踩"坑". 笔者记录一次踩坑历程,并且给了一些总结,希望到大家在使用python的过程之中,能够避免一些可能产生隐患的代码. r ...

  4. python如何读取文件指定行_Python读取文件、大文件和指定行内容的几种方法

    在使用python处理文本的时候,经常会需要读取文件的内容.如果文件比较小,那么直接使用open文件对象打开文件,再通过read()方法最为方便,这种方法就是把文件内容读出来后放到内存变量. read ...

  5. python读取文件第一行_python读取文件首行和最后一行

    python读取文件最后一行两种方式 1)常规方法:从前往后依次读取 步骤:open打开文件. 读取文件,把文件所有行读入内存. 遍历所有行,提取指定行的数据. 优点:简单,方便 缺点:当文件大了以后 ...

  6. python读取字符串指定位置字符_python读取txt文件中特定位置字符的方法

    python读取txt文件中特定位置字符的方法 如下所示: # -*- coding:utf-8 -*- import sys reload(sys) sys.setdefaultencoding(' ...

  7. python dialect='excel'是什么意思_python读取和生成excel文件

    今天来看一下如何使用python处理excel文件,处理excel文件是在工作中经常用到的,python为我们考虑到了这一点,python中本身就自带csv模块... 今天来看一下如何使用python ...

  8. python读取excel内容和写入_Python读取和写入Excel文件

    制作Excel表 常用方法说明 Workbook类 Workbook类创建一个XlswWrite的Workbook对象,相当于创建一个excel表 And_worksheet()用来创建工作表,默认为 ...

  9. python加载图片并显示_python读取目录下所有的jpg文件,并显示第一张图片的示例...

    python读取目录下所有的jpg文件,并显示第一张图片的示例 如下所示: # -*- coding: UTF-8 -*- import numpy as np import os from scip ...

最新文章

  1. 通过JDBC进行简单的增删改查(二)
  2. python搭建可视化管理平台_搭建可视化数据平台 superset
  3. 基于 Zookeeper 的分布式锁实现
  4. MobileNet、GhostNet理解及测试
  5. HTTP的同源策略与跨域资源共享(CORS)机制
  6. MFC透明桌面flash金鱼
  7. CompletableFuture详解~思维导图
  8. 什么样的程序猿,最容易被鄙视?
  9. 月薪2W和月薪10W的差别,怎么判断一个产品经理的专业水平高低?
  10. python中yield的使用(两分钟读懂)
  11. Mac安装Redis
  12. 2019年IT行业的十大热门岗位
  13. Hive——多行转一行及一行转多行
  14. oracle exadata x7发布,没有对比就没有伤害 QData T5完虐Oracle Exadata X7
  15. java闪光灯手电筒_Android_Android 开启闪光灯做手电筒的详解,复制代码 代码如下:public class H - phpStudy...
  16. 《左手数据,右手图表》
  17. 最便宜的粤语语音机器人
  18. 【RASA】Core模块
  19. license生成工具
  20. Java语言基础(三)——异常、容器、泛型

热门文章

  1. Windows Storage Server 2003 R2 英文正式版已发布
  2. 最著名的10位程序员,你都知道吗?
  3. 七年程序员生涯,我学到最重要的 6 个教训,别再中招!
  4. c/c++永不过时的编程语言
  5. 5分钟看懂,未来1年web前端新趋势,都在这了!!!
  6. 2018年全国《程序员高考》真题试卷
  7. 关于MacBook Pro 15 usb连接iPhone反复重连的解决办法
  8. java初始化虚拟机错误_VM初始化期间发生错误;无法为对象堆保留足够的空间;无法创建Java虚拟机...
  9. 1.9 编程基础之二分查找 12 最长平台 python
  10. 2.3 基本算法之递归变递推 放苹果 python