python读GB级大文件
首推with open( )
其实之前有很长一段时间不知道with open()的神奇作用,直到这次遇到问题,才发现它的奇妙之处。原来python中用with语句打开和关闭文件,包括了抛出一个内部块异常,并且,for line in f其实是将文件对象f视为一个迭代器,自动的采用缓冲IO和内存管理,所以不必担心大文件。让系统来处理,其实是最简单的方式,交给解释器,就万事大吉了。
|
|
Read In Chunks
这是正常情况下大家都会想到的办法,就是将大文件分割成若干小文件处理,处理完每个小文件后释放该部分内存。可以参照之前的这篇文《python提高读文件效率》
https://github.com/Shuang0420/Shuang0420.github.io/wiki/python%E6%8F%90%E9%AB%98%E8%AF%BB%E6%96%87%E4%BB%B6%E6%95%88%E7%8E%87
代码如下
|
|
或者
|
|
顺便提一下我遇到的问题,因为后面测试需要,我将读取的文件按行存到了list里面,memory使用率一路飙升过50%,这真是作死的节奏……之后我取了前500行做测试,memory始终稳定保持在3.5%,问题解决。
参考链接 http://chenqx.github.io/2014/10/29/Python-fastest-way-to-read-a-large-file/
下面这个方法虽然快,但是每次是读一定数量的字符,主要应用于没有换行符的文本。此方法用于有换行符的文件时,可以使用split("\n")
的方法提取内容,但是可能要涉及拼接,上一个chunk的末尾拼接下一个chunk的开头
|
|
One useful application of the second form of iter() is to build a block-reader. For example, reading fixed-width blocks from a binary database file until the end of file is reached:
|
|
Reference
1、 https://github.com/Shuang0420/Shuang0420.github.io/wiki/python%E8%AF%BBGB%E7%BA%A7%E5%A4%A7%E6%96%87%E4%BB%B6
2、 https://v3u.cn/a_id_97
打赏
微信 | 支付宝 |
---|---|
万分感谢 |
- 原文作者:冷眼
- 原文链接:https://cold-eye.github.io/post/python-open-big-file/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。