【问题标题】:How to process each line of a text file having more than 50 million lines in an optimal way using Python?如何使用 Python 以最佳方式处理超过 5000 万行的文本文件的每一行?
【发布时间】:2018-07-01 02:25:40
【问题描述】:

我的文件中有超过 5000 万行。每行都以一些特定的两个字符代码开头。示例文件行是:
AB1357 0000 -9999 XFAB ...
AB1358 0000 -9999 XABC ...
BC 3233 1322 -8638 SCDR ...
如您所见,每行的前两个字符是一个代码。我必须根据他所在行的 "code" 对每一行进行一些处理。现在我正在逐行处理文件,这需要很多时间。有什么办法可以优化这个吗?我正在使用 Python。
注意:我已经拥有所有可能的 60 个代码的列表。

【问题讨论】:

  • 既然你显然想处理每一行,我不确定你对这个问题的意图是什么。您需要处理每一行才能处理每一行
  • 你的线条大小都一样吗?无论如何,如果您需要完整阅读文件所必须的所有信息...
  • 由于我在处理后将所有相同的代码行写入特定文件,我想知道是否有任何方法可以将具有相同代码的行分组并立即处理它们?
  • 行大小取决于代码,我需要行中的所有信息
  • 这可能是 X-Y 问题。听起来代码很慢,不是文件的读取。

标签: python python-3.x file


【解决方案1】:

此类问题的一个典型工作流程是使用 blaze 框架(或 dask.dataframe)“延迟加载”文件,然后按顺序:根据每个代码切片,加载到内存中,执行操作,导出结果。

这假设每个切片都可以放入内存中。

如果你的输入文件是 csv 格式,你可以这样做:

import dask.dataframe as dd

df = dd.read_csv('InputFile.csv', header=None, names=['Id', 'Col1', 'Col2', 'Col3'])

codes = ['AB', 'AC', 'AD']

for code in codes:
    df_slice = df[df['Id'].str.startswith(code)]

    # bring slice in memory
    df_slice_pandas = df_slice.compute()

    # perform your calculations here

    # export slice + results to file
    df_slice_pandas.to_csv('OutputFile_'+code+'.csv', index=False)

【讨论】:

    【解决方案2】:

    首先,我认为您需要一种方法来逐行读取大文件大小的文件。我偶然发现了一些与您类似的帖子

    您可能会受到硬件的限制。

    如果您不需要一次处理所有行,也许您可​​以实现一个快速的字符串模式识别/搜索算法,该算法将定位感兴趣的两个字符代码,因为您有它们的列表。

    这个家伙,亚伦,bypasses the "reading line by line" part and loads the file into RAM.

    您可以尝试创建大文件的块,然后使用 pythons 多线程库。或者试试python字典。

    点击那个谷歌按钮。全部归功于原作者。

    学生_23

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-04
      • 2017-03-10
      • 2022-01-01
      相关资源
      最近更新 更多