在python中读取大数据的不同方法

时间:2011-12-09 16:34:44

标签: python line

我正在处理大数据,因此找到一种阅读数据的好方法非常重要。 我对不同的阅读方法感到有些困惑。

1.f=gzip.open(file,'r')
      for line in f:
          process line
     #how can I process nth line? can I?
2.f=gzip.open(file,'r').readlines()
  #f is a list
  f[10000]
  #we can process nth line

3.f=gzip.open(file,'r')
  while True:
       linelist=list(islice(f,4))

4.for line in fileinput.input():
  process line

2和3有什么区别?我发现他们的内存使用情况是一样的。 islice()还需要先将整个文件加载到内存中(但稍后才会逐位加载)。 而且我听说第四种方法消耗的内存最少,它实际上是一点一点地处理,对吧? 对于10GB级文件,您会推荐哪种文件读取方法?欢迎任何想法/信息。 THX

编辑:我认为我的一个问题是我需要随机选择特定的行。 说:

f1=open(inputfile1, 'r')
while True:
    line_group1 = list(islice(f1, 3))
    if not line_group1:
        break
    #then process specific lines say, the second line.
    processed 2nd line
    if ( ....):
           LIST1.append(line_group1[0])
           LIST1.append(processed 2nd line)
           LIST1.append(line_group1[2])

然后......喜欢

with open(file,'r') as f,
    for line in f:
       # process line

可能无效,我是否正确?

5 个答案:

答案 0 :(得分:5)

查看David M. Beazley关于使用生成器解析大型日志文件的演讲(请参阅演示文稿的pdf):

http://www.dabeaz.com/generators/

答案 1 :(得分:5)

你忘记了 -

with open(...) as f:
    for line in f:
        <do something with line>

with语句处理打开和关闭文件,包括是否在内部块中引发异常。 for line in f将文件对象f视为可迭代,它自动使用缓冲的IO和内存管理,因此您不必担心大文件。

两个2,3都不建议大文件阅读&amp;在处理开始之前将整个文件内容加载到内存中。要读取大文件,您需要找到一次不读取整个文件的方法。

  

应该有一种 - 最好只有一种 - 显而易见的方法。

答案 2 :(得分:1)

您可以在迭代某些内容时使用enumerate来获取索引:

for idx, line in enumerate(f):
    # process line

简单且内存效率高。您实际上也可以使用islice,并迭代它而不先转换为列表:

for line in islice(f,start,stop):
    # process line

这两种方法都不会将整个文件读入内存,也不会创建中间列表。

对于fileinput,它只是一个快速循环标准输入或文件列表的辅助类,使用它没有内存效率优势。

正如Srikar指出的那样,使用with语句是打开/关闭文件的首选方式。

答案 3 :(得分:0)

在您阅读并计算其中有多少\ n之前,您不知道有多少行。 在1中,您可以添加枚举来获取行号。

答案 4 :(得分:0)

要阅读大文件中的特定行,您可以使用linecache library