[转]python 大文件以行为单位读取方式比对
来源:互联网 发布:单例模式 java enum 编辑:程序博客网 时间:2024/05/16 10:54
[转]http://www.cnblogs.com/aicro/p/3371986.html
先前需要做一个使用python读取大文件(大于1G),并逐条存入内存进行处理的工作。做了很多的尝试,最终看到了如下的文章。
http://stackoverflow.com/questions/8009882/how-to-read-large-file-line-by-line-in-python
该文章实际上提供了集中读取大文件的方式,先经过测试总结如下
1. for line in fileHandle:
该方式是最快速的。而且python虚拟机在内部帮助我们对buffer进行管理,内存占用量小,且不差错。
2. fileinput方式
该方式实际效果较慢,但是也有buffer管理功能
3. (自己摸索和尝试的)使用file.read(sizeHint)的方式进行区块读取
该方法是三者中最慢的,而且需要自己去控制内存和选择需要的区域,所以在读到的buffer之后,还需要进行拆分工作,比较麻烦,而且容易出错。最无奈的是,使用下来(我的环境是2.6和2.7),sizeHint作用较小,原来觉得如果sizeHint是1024,则每次在内存中只会驻留1024B的内容,但是实际上不是这样的,在度过一次1024B之后,再次读取1024B的时候,尽管已经对之前的buf进行了del操作,但是该1024B仍然存留于内存中,所以内存越吃越大,最终MemoryError。
4. file.readline和file.readlines
和read类似,只适用于小文件。
结论:
在使用python进行大文件读取时,应该返璞归真,使用最简单的方式,交给解释器,就管好自己的工作就行了。
附,实测数据(这里的数据是我的程序的实际运行情况,在程序中其实读了两个差不多大小的文件,并做了一定逻辑处理,所以绝对值是没有意义的,但是相对比较值很能够说明情况)
1. 大文件(>1.4G)
所使用的方式size_hint所使用时间for i in open(...) /103.382492sfileinput /131.525755sfile.read和buffer控制2亿B报错:memoryError
2. 小文件(西游记的txt,大约1.4M)
所使用的方式size_hint所使用时间for i in open(...) / 2.11sfileinput /4.22sfile.read和buffer控制2亿B4.07s
------------------------------------------------------------------------
- python 大文件以行为单位读取方式比对
- [转]python 大文件以行为单位读取方式比对
- 【工具类】JAVA 以行为单位读取文件并比对
- 读取文件以行为单位逆序输出到另一文件
- java 以行为单位读取txt文件(1)
- java 实现以行为单位读取txt文件(1)
- 以行为单位读写文件
- 以行为单位读取文本文件(c++)
- 以行为单位的文件处理程序
- 【Java】运用多种方式读取文件内容,包括按字节、字符和按行为单位读取文件内容
- java对txt文本文件的复制粘贴(对文件内容进行了简单的修改)以行为一个处理单位
- python读取大文件
- Python 读取大文件
- python读取大文件
- Python 读取大文件
- Python 大文件读取
- python对文件的读取操作方式比较
- java 以字节为单位读取文件(2)
- java自学笔记————IO流中的键盘输入流和输出流详解;
- [LeetCode] Number of Islands
- nyoj 104 最大和 【压缩矩阵 DP求最大连续子序列的和】
- UVA 11090 - Going in Cycle!!(最短路`Bellman-Ford)
- 非常有用的android控件编程
- [转]python 大文件以行为单位读取方式比对
- 约瑟夫环问题
- 关于CoreData和SQLite多线程访问时的线程安全问题
- HDU 4821 String (2013长春现场赛I题) 字符串Hash
- Linux基础:如何找出你的系统所支持的最大内存
- Multiply Strings 大数相乘
- rt-thread学习笔记开篇
- jsp 分页操作的实现
- C++实现MATLAB一维数组函数findpeaks()函数求一维离散值极值(波峰波谷)