我需要逐行读取文件中的100 GB(4亿行)数据。这是我目前的代码,但有没有有效的方法来做到这一点。 我的意思是执行速度。
f = open(path, 'r')
for line in f:
...
f.close()
答案 0 :(得分:2)
答案 1 :(得分:2)
如果行具有固定的字节长度,并且不必按任何特定顺序读取行(您仍然可以知道行号),则可以轻松地将其拆分为并行子任务,在多个线程中执行/工艺。每个小时图只需知道seek()
的位置和read()
的字节数。
同样在这种情况下,逐行读取并不是最佳选择,因为它需要扫描\n
,而只需使用固定长度的read()
。
答案 2 :(得分:1)
如果您有多核机器,并且可以使用Python 3.2(而不是Python 2),这将是Python 3.2中concurrent.futures
新功能的一个很好的用例 -
取决于您需要对每条线进行的处理。如果您要求按文件顺序完成处理,您可能不得不担心稍后重新组合输出。
否则,使用concurrent.futures可以轻松地安排每个客户端在不同的任务中处理。你必须在那产生什么输出?
如果你认为你不会从并行化每一行的内容中获利,那么最明显的方法就是做到:即你刚才所做的事。
这个例子将处理分为12个子进程,每个子进程执行Python的内置len
函数。将len
替换为接收该行作为参数的函数,并执行您需要在该行上处理的任何内容:
from concurrent.futures import ProcessPoolExecutor as Executor
with Executor(max_workers=5) as ex:
with open("poeem_5.txt") as fl:
results = list(ex.map(len, fl))
需要“list”调用来强制映射在“with”语句中完成。如果您不需要每行的标量值,而是将结果记录在文件中,则可以在for循环中执行此操作:
for line in fl:
ex.submit(my_function, line)