Python:高效文件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,但我想知道我是否能做得更好。对于这项任务,速度是至关重要的。

谢谢。

下面的代码不会从输入文件中积累数据到内存中,除非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),或者文件不是文本,则此代码可能无法正常工作。

您可以使用with语句来确保您的文件在执行后关闭。从这个博客条目:

打开文件,处理其内容,并确保关闭它,您可以简单地执行:

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

String 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

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

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

while a_line and b_line

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

最新更新