同时读取两个大文件并进行一些处理的最有效(最快)方法是什么?
我有两个文件;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
对行并将每对发送到新线程或类似的线程来多线程。