Python:高效的文件io

时间:2011-11-08 03:56:19

标签: python file-io

同时读取两个大文件并进行一些处理的最有效(最快)方法是什么?

我有两个文件; a.txt和b.txt,每个包含大约十万对应的行。我的目标是读入这两个文件,然后对每一行进行一些处理

def kernel:
    a_file=open('a.txt','r')
    b_file=open('b.txt', 'r')
    a_line = a_file.readline()
    b_line = b_file.readline()
    while a_line:
        process(a_spl,b_spl) #process requiring both corresponding file lines

我查看了xreadlines和readlines,但我想知道我是否可以做得更好。速度对于这项任务至关重要。

谢谢。

4 个答案:

答案 0 :(得分:2)

以下代码不会累积内存中输入文件的数据,除非process函数单独执行此操作。

from itertools import izip

def process(line1, line2):
  # process a line from each input

with open(file1, 'r') as f1:
  with open(file2, 'r') as f2:
    for a, b in izip(f1, f2):
      process(a, b)

如果process函数有效,则此代码应该足够快地运行以用于大多数目的。当达到一个文件的末尾时,for循环将终止。如果任一文件包含非常长的行(即XML,JSON),或者文件不是文本,则此代码可能无法正常工作。

答案 1 :(得分:1)

您可以使用with语句确保文件在执行后关闭。来自this blog entry

  

打开文件,处理其内容,并确保将其关闭,您只需执行以下操作:

with open("x.txt") as f:
    data = f.read()
    do something with data

答案 2 :(得分:1)

字符串IO可能非常快 - 可能您的处理将减慢速度。考虑一个简单的输入循环来提供如下队列:

queue = multiprocessing.Queue(100)
a_file = open('a.txt')
b_file = open('b.txt')
for pair in itertools.izip(a_file, b_file):
     queue.put(pair) # blocks here on full queue

您可以设置一个进程池,从队列中提取项目并对每个进行操作,假设您的问题可以通过这种方式并行化。

答案 3 :(得分:0)

我将你的while条件更改为以下内容,以便当a的行多于b时它不会失败。

while a_line and b_line

否则,这看起来不错。您正在阅读所需的两行,然后进行处理。您甚至可以通过读取N对行并将每对发送到新线程或类似线程来多线程化。