zoukankan      html  css  js  c++  java
  • python 大文件以行为单位读取方式比对

    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

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

  • 相关阅读:
    redis 中 set 和 hset 有什么不同,什么时候使用 hset 什么时候使用set?
    redis的底层数据结构
    python开发-实现redis中的发布订阅功能
    使用redis-py的两个类Redis和StrictRedis时遇到的坑
    python使用redis实现协同控制的分布式锁
    深入理解 Python 异步编程(上)
    linux中read,write和recv,send的区别
    socket常见问题
    python socket 编程之三:长连接、短连接以及心跳
    Flask快速入门
  • 原文地址:https://www.cnblogs.com/DjangoBlog/p/3655176.html
Copyright © 2011-2022 走看看