【问题标题】:Efficient way to read data in python [duplicate]在python中读取数据的有效方法[重复]
【发布时间】:2011-07-29 05:27:05
【问题描述】:

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

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

f = open(path, 'r')

for line in f: 
    ...

f.close()

【问题讨论】:

  • 你有一个 100 GB 的文件???
  • 这几乎是最好的方法。
  • 难以置信。如果它生成 100GB 文件,显然你的应用程序有问题:-)
  • 仅 100GB 文件就应该得到 -1,但这是欢乐时光 :)
  • @Rest: 100GB 不一定是 -1。也许OP真的有那么多数据! (CERN 估计每天产生 40,000GB。)

标签: python


【解决方案1】:

如果行的字节长度是固定的,并且不必以任何特定的顺序读取行(尽管您仍然可以知道行号),那么您可以轻松地将其拆分为并行子任务,在多个线程中执行/进程。每个子象牙只需要知道seek() 的位置以及read() 的字节数。

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

【讨论】:

    【解决方案2】:

    如果您有一台多核机器,并且可以使用 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)
    

    【讨论】:

      猜你喜欢
      • 2018-10-21
      • 1970-01-01
      • 2017-08-19
      • 1970-01-01
      • 2019-09-04
      • 1970-01-01
      • 1970-01-01
      • 2020-11-01
      • 1970-01-01
      相关资源
      最近更新 更多