如何读超大文件?

2020年11月7日 / 60次阅读 / Last Modified 2020年11月7日

用python读超大文件,数十个G的那种,需要有一点技巧:

  • 不能使用readlines函数,它会将文件内容全部读入内存,一般电脑的内存,都不会有数十个G那么多;
  • 谨慎使用readline函数,除非你非常清楚,这个数十G的文件每一行大致有多长,有可能这个超大文件就一行,从头到尾都没有一个换行符;
  • 只能使用read(N),一定要带一个读取长度N(readline(N)也可以带上读出长度)。
  • 如果仅仅是读取超大文件的内容,没有必要使用mmap,时间和空间效率反而更低,代码也更复杂。

以上就是我个人总结的经验。

下面是我封装的一个读取超大文件的生成器(generator)

from functools import partial


def read_blocks(pathname, mode='r', block_size=1024**2):
    if mode not in ('r', 'rb'):
        raise ValueError('mode parameter error')
    stopper = '' if mode=='r' else b''
    with open(pathname, mode) as f:
        for chunk in iter(partial(f.read, block_size), stopper):
            yield chunk

read_blocks,生成器,默认的block_size=1M,这个参数用来控制使用多大的内存!mode in ('r', 'rb'),这样二进制文件的读取也支持了。这个函数用到了builtin的iter函数,和partial函数

这个读取超大文件的生成器,瓶颈其实在读硬盘的环节,内存已经被控制住了。我测试了一个36G的超大文件,全部读完一遍,还是要花点时间,也就几分钟吧,如果再加上一些计算处理的代码,时间会稍微长一点点。

还有个细节要注意,读取出来的chunk,如果需要做查找的话,要注意边缘的情况,有可能你要查找字符串,被chunk了!

-- EOF --

本文链接:https://www.pynote.net/archives/2763

相关文章

    留言区

    《如何读超大文件?》有1条留言

    您的电子邮箱地址不会被公开。 必填项已用*标注

    • 麦新杰

      多线程快速读取超大文件呢.... [回复]


    前一篇:
    后一篇:

    More

    麦新杰的Python笔记

    Ctrl+D 收藏本页


    ©Copyright 麦新杰 Since 2019 Python笔记

    go to top