可能重复:
Lazy Method for Reading Big File in Python?有效的方式在Python读取数据
我需要从文件里逐行读取数据的100 GB(400万条用户线)。这是我目前的代码,但有没有任何有效的方法来做到这一点。 我的意思是在执行速度方面。
f = open(path, 'r')
for line in f:
...
f.close()
可能重复:
Lazy Method for Reading Big File in Python?有效的方式在Python读取数据
我需要从文件里逐行读取数据的100 GB(400万条用户线)。这是我目前的代码,但有没有任何有效的方法来做到这一点。 我的意思是在执行速度方面。
f = open(path, 'r')
for line in f:
...
f.close()
不完全重复。另一个问题(和它的答案)是针对二进制文件的。 – jsbueno 2011-04-04 18:05:04
如果行固定字节长度,而线不必在被读取复制任何特定的顺序(你仍然可以知道行号),比你可以很容易地将它分成平行的子任务,以m多线程/进程。每个substusk只需要知道到何处seek()
和多少个字节到read()
。
此外,在这种情况下,逐行读取并不是最理想的,因为它需要扫描\n
,而只是使用固定长度的read()
。
如果您有一个多核计算机,并且可以使用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)
您有单个100 GB文件? – 2011-04-04 14:17:14
这几乎是最好的方法。 – 2011-04-04 14:18:06
令人难以置信。很明显,如果它产生100GB的文件,应用程序中出现了一些问题:-) – 2011-04-04 14:19:22