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.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

------------------------------------------------------------------------

python 大文件以行为单位读取方式比对的更多相关文章

  1. python大文件读取

    python大文件读取 https://stackoverflow.com/questions/8009882/how-to-read-a-large-file-line-by-line-in-pyt ...

  2. python 读取大文件,按照字节读取

    def read_bigFile(): f = open("123.dat",'r') cont = f.read() : print(cont) cont = f.read() ...

  3. Python 大文件处理

    非内存资源可以使用with 在python中逐行读取大文件 在我们日常工作中,难免会有处理日志文件的时候,当文件小的时候,基本不用当心什么,直接用file.read()或readlines()就可以了 ...

  4. iOS将大文件映射到内存(读取大文件)

    http://blog.csdn.net/xyt243135803/article/details/40995759 在<中国区GPS偏移纠正(适用于Google地图)>一文中曾读取一个7 ...

  5. python大文件迭代器的流式读取,之前一直使用readlines()对于大文件可以迅速充满内存,之前用法太野蛮暴力,要使用xreadlines或是直接是f,

    #!/usr/bin/env python #encoding=utf-8 import codecs count =0L #for line in file("./search_click ...

  6. python读取大文件【一行一行读取】

    with open('e:/content.txt') as f: for line in f: if '==3346628==' in line: …………

  7. python txt文件的写入和读取

    1.文件的打开 使用open () 函数 打开文件.他有两个参数,文件路径或文件名和文件的打开方式. "r" 只读模式,不能编辑和删除文件内容. "w" 写入模 ...

  8. 用python打开文件夹的三种方式

    一.利用explorer.exe import os # 利用explorer.exe执行 start_directory = r'C:\代码\软件包' os.system("explore ...

  9. java 分次读取大文件的三种方法

    1. java 读取大文件的困难 java 读取文件的一般操作是将文件数据全部读取到内存中,然后再对数据进行操作.例如 Path path = Paths.get("file path&qu ...

随机推荐

  1. sybase SA密码重置

    sa 密码忘记解决之道: su - sybase cd ASE/install vi RUN_etoh2 在文件的末尾加入 -psa \ 停止原数据库服务 由于密码遗忘,所以只能通过kill进程停止服 ...

  2. JavaScript的DOM操作(一)

    DOM:文档对象模型 --树模型文档:标签文档,对象:文档中每个元素对象,模型:抽象化的东西 一:window: 属性(值或者子对象):opener:打开当前窗口的源窗口,如果当前窗口是首次启动浏览器 ...

  3. CI框架篇之预热篇(1)

    CodeIgniter 的基本都了解了,现在就开始预热,如果学习一门语言一样,我们最开始都是输出一个'HELLO WORLD'一样, 现在我们也通过输出这样一个内容,来了解基本的使用. CodeIgn ...

  4. 在VS中关于MySQL的相关问题

    最近在vs上折腾mysql数据库 遇到了一些小问题,这里记录一下 问题一:数据源选择中没有mysql数据库的选项 解放方法: 1.安装MySql的VS插件(版本请下载最新版)mysql-for-vis ...

  5. 重温sql语句中的join操作

    1.join语句 Sql join语句用来合并两个或多个表中的记录.ANSI标准SQL语句中有四种JOIN:INNER,OUTER,LEFTER,RIGHT,一个表或视图也可以可以和它自身做JOIN操 ...

  6. the account is currently locked out. The system administrator can unlock it.

    今天遇到的问题比较有意思.首先是很久没有打开测试数据库了,今天打开,使用service程序测试的时候出现下面的错误提示:Message: System.Data.SqlClient.SqlExcept ...

  7. php编译安装扩展curl

    ./configure --with-php-config=/opt/software/php5.4/bin/php-configyum install curl curl-devel

  8. 如何获得Windows 8中已记住的WIFI的明文密码

    网上很流行的一种查看WIFI密码明文的方法,如下: 今天遇到了一种状况,就是如果不连WIFI的情况我能抓到这个密码吗?(实在不想开口问同事密码多少,只能苦逼的自己想办法了o(︶︿︶)o ) 答案当然是 ...

  9. (七)Struts2 验证框架

    所有的学习我们必须先搭建好Struts2的环境(1.导入对应的jar包,2.web.xml,3.struts.xml) 第一节:Struts2 验证简介 Struts2 基于Struts2 拦截器,为 ...

  10. Masonry等比缩放

    第一种: CGFloat width = CGRectGetWidth([[UIScreen mainScreen] bounds]);         CGFloat aspectRatio = 1 ...