资讯专栏INFORMATION COLUMN

使用 Python 读取 8 GB 大小的文件

animabear / 3065人阅读

摘要:笔试问题如何使用读取个大小的文件这个问题其实在笔试中会经常遇到的个题目。解决方案在中除了使用方法读取文件内容外还有另外个方法和也可以进行内容的读取。结果发现使用的方式还是会导致内存不足的情况发生而通过读取指定字节的方式则可以处理完这个文件。

笔试问题

如何使用Python读取1个8GB大小的文件,这个问题其实在笔试中会经常遇到的1个题目。对于在Python中读取文件的操作,一般我们会这样来操作:

f = open("filename","rb")
f.read()

下面我们来找1个比较大的文件,比如1个nginx的日志文件,记得之前有一次公司的1天的nginx日志文件解压为3GB大小,不得不对其进行切分。

发现问题

这里我们找到了1个3G大小的文件。接下来,我们使用普通的读取方式来查看该文件的内容:

f=open("test","rb")
data=f.read()
---------------------------------------------------------------------------
MemoryError                               Traceback (most recent call last)
...
MemoryError: 

我们可以看到1个MemoryError的错误,说明该无文件无法被装载在内存中发生溢出了。
下面我们来思考下为什么内存会溢出了,在我们打开文件的时候并没有发生任何异常,而在我们调用read方法时才出现问题。我们知道,文件对象的read方法会尝试将所有内容以1行的形式读入,显然这种方式对于大文件是不可行的。

解决方案

在Python中,除了使用read方法读取文件内容外,还有另外2个方法readline和readlines也可以进行内容的读取。
既然默认read方法是一次性的将内容都读取到内存中,那么我们是否可以指定其每次读取的长度来解决这个问题呢?

data = f.read(1024)
while 1:
  #处理该行的代码
  data = f.read(1024)

而readlines会返回每1行读取的内容的列表,因此有一定风险的。

for l in f.readlines():
   #处理这1行的代码

那么,我们每次读取1行总可以了把。这样我们可以通过如下的方式来进行:

line = f.readline()
while 1:
    #处理该行的代码
    line = f.readline()

我们通过1个无限循环的方式来进行读取。结果发现,使用readlines的方式还是会导致内存不足的情况发生,而通过读取指定字节的方式则可以处理完这个文件。
在上面的解决方案中,我们需要手动处理文件读取的大小,并在合适的情况退出读取的操作。
那么,我们有没有更好的解决方案呢?实际上是有的,在Python的手册中,有1个xreadlines的方法,这个方法就类比range和xrange函数的区别。这个方法返回类似iter(f)的字符串,但是遗憾的是该方法在Python版本2.3中已经被淘汰了,官方建议我们使用for语句来替代:

for line in f:
    #处理该行的代码

通过这种方式,Python将处理文件对象为1个迭代器,并自动使用缓存IO和内存管理,这样我们就不需要关注大的文件了。

参考文件:

http://stackoverflow.com/questions/8009882/how-to-read-large-file-line-by-line-in-python

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/37964.html

相关文章

  • Python之路--python基础2

    摘要:内容列表元组操作字符串操作字典操作集合操作文件操作字符编码与转码内置函数在中,最基本的数据结构是序列。序列中的每个元素被分配一个序号即元素的位置,也称为索引。空字典不包括任何项由两个大括号组成。 day2内容1、列表、元组操作2、字符串操作3、字典操作4、集合操作5、文件操作6、字符编码与转码7、内置函数 在Python中,最基本的数据结构是序列(sequence)。序列中的每个元素被...

    Binguner 评论0 收藏0
  • 一个简单python爬虫实现——爬取电影信息

    摘要:最近在学习网络爬虫,完成了一个比较简单的网络爬虫。网络爬虫,可以理解为自动帮你在网络上收集数据的机器人。网络爬虫简单可以大致分三个步骤第一步要获取数据,第二步对数据进行处理,第三步要储存数据。 最近在学习网络爬虫,完成了一个比较简单的python网络爬虫。首先为什么要用爬虫爬取信息呢...

    番茄西红柿 评论0 收藏2637
  • 奇技淫巧第二期

    摘要:因为产生的顺序是先比较第一位,再比较第二位,并且没有很好的解决办法。这种语法的限制是,需要保证异常从属与异常。两个异常都将显示。 这个系利的初衷是回顾琐碎知识点,但...

    Rocture 评论0 收藏0
  • 如何优化Python占用内存

    摘要:概述如果程序处理的数据比较多比较复杂,那么在程序运行的时候,会占用大量的内存,当内存占用到达一定的数值,程序就有可能被操作系统终止,特别是在限制程序所使用的内存大小的场景,更容易发生问题。下面我就给出几个优化占用内存的几个方法。 概述 如果程序处理的数据比较多、比较复杂,那么在程序运行的时候,会占用大量的内存,当内存占用到达一定的数值,程序就有可能被操作系统终止,特别是在限制程序所使用...

    ThreeWords 评论0 收藏0

发表评论

0条评论

animabear

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<