同时读取两个大文件并进行一些处理的最有效(最快)方法是什么?
我有两个文件; 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,但我想知道我是否可以做得更好。速度对于这项任务至关重要。
谢谢。答案 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
对行并将每对发送到新线程或类似线程来多线程化。