【问题标题】:Python - Infinite loop while batch-wise reading very large textfilePython - 批量读取非常大的文本文件时的无限循环
【发布时间】:2020-04-28 04:29:06
【问题描述】:

好的, 我有一个大 (8 GB+) txt 文件,其中包含很可能来自大型机 b/c 的遗留数据,它都是必须逐行和逐字符解析的固定字段。逐行读取文件在小样本上工作正常,但不会超过几百 MB。

本质上,我想分批读取 txt 文件,比如每批 500 万行,然后逐行处理每个批处理。

那是我用 Python 写的,但由于某种原因,当在较小的文件上测试时,下面的代码最终会陷入无限循环。我有点困惑,中断实际上从未被触发并且快照一直被覆盖。知道如何解决吗?

# Python 3.x 
def convert_txt_to_csv(path_to_txt, path_to_save_csv, column_names):
    df = pd.DataFrame(columns=column_names)

    chunksize = 5000 # 5000000 - 5 million batches for the big file

    print("Add rows...")
    with open(path_to_txt, 'r', encoding="ISO-8859-1") as file:

        lines = True
        cnt = 0
        mil = 1

        while lines:

            lines = file.readlines(chunksize) # This guy should become False if there no more lines...
            if not lines:
                break # Double safety, if they're no more lines, escape the loop... 

            for line in lines:
                process_line(line.replace('\n', ''), df, cnt)
                cnt += 1

         # save snapshot after each batch 
         df.to_csv(path_to_snapshot_csv)
         print("Saved Snapshot: ", mil)
         mil +=1


    print("Process")
    df = process(df)
    print("Safe")
    df.to_csv(path_to_save_csv)
    print("Nr. of data: ", len(df.index))


【问题讨论】:

  • 嗨 Marvin Hansen,您能否提供输入文件及其匹配输出的示例示例?
  • 谢谢,刚刚添加了一个例子。只是说,转换适用于小样本。我要解决的实际问题是在 8GB 上逐行加速转换 b/c 需要永远和一天,因此是批量...
  • 为什么不直接使用 readline() 而不是 readlines() ? (注意末尾的s
  • 嗯,它更快,因为将所有内容都保存在内存中会更快,但如果它太大,则没有太多替代方案。可能在实际将它们写入磁盘之前读取并处理几行(比如 1000 行),以减少 I/O 操作。
  • 已解决 :-) 添加了答案。

标签: python python-3.x loops file


【解决方案1】:

解决方案:

上面的代码确实有效,但实际的错误是快照行的意图不正确,并且在每行而不是在每批之后被调用,因此给人的印象是循环会因为永远重新创建快照而被卡住。我在此期间应用了一些优化:

1) 对于没有批处理的合理大小的文件:

for line in file: # 不要使用 readline...

        process_line(line) 

2) 加快文件读取速度:

创建一个 ramdisk 并在那里复制输入文件。

3) 对于批处理,readline 中的块参数是某种奇怪的字节大小,例如,1500000 转换为连续读取 2995 行。

使用 ramdisk 和批处理,现在处理实际上相当快。感谢所有宝贵的意见和问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多