在python中读取数据的有效方法

时间:2011-04-04 14:14:58

标签: python

  

可能重复:
  Lazy Method for Reading Big File in Python?

我需要逐行读取文件中的100 GB(4亿行)数据。这是我目前的代码,但有没有有效的方法来做到这一点。 我的意思是执行速度。

f = open(path, 'r')

for line in f: 
    ...

f.close()

3 个答案:

答案 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)