2011-04-04 59 views
4

可能重复:
Lazy Method for Reading Big File in Python?有效的方式在Python读取数据

我需要从文件里逐行读取数据的100 GB(400万条用户线)。这是我目前的代码,但有没有任何有效的方法来做到这一点。 我的意思是在执行速度方面。

f = open(path, 'r') 

for line in f: 
    ... 

f.close() 
+0

您有单个100 GB文件? – 2011-04-04 14:17:14

+2

这几乎是最好的方法。 – 2011-04-04 14:18:06

+0

令人难以置信。很明显,如果它产生100GB的文件,应用程序中出现了一些问题:-) – 2011-04-04 14:19:22

回答

2

如果行固定字节长度,而线不必在被读取复制任何特定的顺序(你仍然可以知道行号),比你可以很容易地将它分成平行的子任务,以m多线程/进程。每个substusk只需要知道到何处seek()和多少个字节到read()

此外,在这种情况下,逐行读取并不是最理想的,因为它需要扫描\n,而只是使用固定长度的read()

1

如果您有一个多核计算机,并且可以使用Python 3.2(而不是Python 2),这将是Python 3.2 - 中的concurrent.futures新功能的良好用例,具体取决于您需要对每个进行的处理线。如果您需要按照文件顺序进行处理,那么稍后可能不得不担心重新组合输出。

否则,使用concurrent.futures可以毫不费力地安排每个客户端在不同的任务中处理。你必须在那产生什么输出?

如果你认为你不会从并行化每行内容中获益,最明显的方法就是最好的方法:就是你刚刚做的。

本示例将处理分为12个子进程,每个子进程执行Python的内置函数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)) 

是必须的“名单”的号召,以强制映射被内“同向”语句来完成:为接收线作为参数,并执行任何你需要在该行处理的函数替换len 。如果您不需要每行的标量值,而是将结果记录到文件中,则可以在for循环中执行此操作:

for line in fl: 
    ex.submit(my_function, line) 
相关问题