zoukankan      html  css  js  c++  java
  • Python3 _ 读取大文件

     ===================== 1============================================

    帖子链接:http://blog.csdn.net/hackstoic/article/details/49804655

    方法一:

    将文件切分成小段,每次处理完小段内容后,释放内存

    这里会使用yield生成自定义可迭代对象, 即generator, 每一个带有yield的函数就是一个generator。

    1. def read_in_block(file_path):  
    2.     BLOCK_SIZE = 1024  
    3.     with open(file_path, "r") as f:  
    4.         while True:  
    5.             block = f.read(BLOCK_SIZE)  # 每次读取固定长度到内存缓冲区  
    6.             if block:  
    7.                 yield block  
    8.             else:  
    9.                 return  # 如果读取到文件末尾,则退出  
    10.   
    11.   
    12. def test3():  
    13.     file_path = "/tmp/test.log"  
    14.     for block in read_in_block(file_path):  
    15.         print block  

    方法二:

    利用open(“”, “”)系统自带方法生成的迭代对象

    1. def test4():  
    2.     with open("/tmp/test.log") as f:  
    3.         for line in f:  
    4.             print line  

    ======================2=============================================

    原帖子: https://www.cnblogs.com/aicro/p/3371986.html 

       其链接:https://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
  • 相关阅读:
    String类的substring方法
    postman绕过登录,进行接口测试的方法
    Dubbo
    那些吊炸天的互联网名词
    版本控制工具git
    Ubunto20.04 sudo apt-get update 出现目标被重置多次!
    ubuntu环境下搭建Hadoop集群中必须需要注意的问题
    Python作业---内置数据类型
    python作业完成简单的文件操作
    python3实现计算器
  • 原文地址:https://www.cnblogs.com/bruce-he/p/8302447.html
Copyright © 2011-2022 走看看