python 大文件以行为单位读取方式比对

先前须要作一个使用python读取大文件(大于1G),并逐条存入内存进行处理的工做。作了不少的尝试,最终看到了以下的文章。python

http://stackoverflow.com/questions/8009882/how-to-read-large-file-line-by-line-in-python测试

 

该文章实际上提供了集中读取大文件的方式,先通过测试总结以下spa

1. for line in fileHandle:内存

该方式是最快速的。并且python虚拟机在内部帮助咱们对buffer进行管理,内存占用量小,且不差错。get

 

2. fileinput方式input

该方式实际效果较慢,可是也有buffer管理功能虚拟机

 

3. (本身摸索和尝试的)使用file.read(sizeHint)的方式进行区块读取io

该方法是三者中最慢的,并且须要本身去控制内存和选择须要的区域,因此在读到的buffer以后,还须要进行拆分工做,比较麻烦,并且容易出错。最无奈的是,使用下来(个人环境是2.6和2.7),sizeHint做用较小,原来以为若是sizeHint是1024,则每次在内存中只会驻留1024B的内容,可是实际上不是这样的,在度过一次1024B以后,再次读取1024B的时候,尽管已经对以前的buf进行了del操做,可是该1024B仍然存留于内存中,因此内存越吃越大,最终MemoryError。table

 

4. file.readline和file.readlinesfile

和read相似,只适用于小文件。

 

结论:

在使用python进行大文件读取时,应该返璞归真,使用最简单的方式,交给解释器,就管好本身的工做就好了。

 

附,实测数据(这里的数据是个人程序的实际运行状况,在程序中其实读了两个差很少大小的文件,并作了必定逻辑处理,因此绝对值是没有意义的,可是相对比较值很可以说明状况)

1. 大文件(>1.4G)

所使用的方式 size_hint 所使用时间
for i in open(...)  / 103.382492s
fileinput          / 131.525755s
file.read和buffer控制 2亿B 报错:memoryError    

 

2. 小文件(西游记的txt,大约1.4M)

 

所使用的方式 size_hint 所使用时间
for i in open(...)   /  2.11s
fileinput          / 4.22s
file.read和buffer控制 2亿B 4.07s
相关文章
相关标签/搜索