You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

处理7GB大文本文件逐行转小写时遭遇MemoryError求助

解决逐行处理大文本文件时的MemoryError问题

你遇到的这个问题其实挺常见的——虽然你用了逐行读取的思路,但如果你的7GB文本里存在没有换行符的超长行,Python在执行for line in r:时,会把整行(哪怕是几个GB的内容)一次性加载到内存里,这直接就超出了内存承载上限,触发MemoryError了。

另外你的代码还有个小坑:每次处理一个.txt文件时,都用"w"模式打开./data/finalData.txt,这会覆盖之前写入的内容,最后只会保留最后一个txt文件的处理结果,我也顺便帮你修正了这个问题。

解决方案:分块读取文件,避开超长行陷阱

既然超长行是罪魁祸首,我们可以改成按固定大小的块来读取文件,不管行有多长,每次只加载一小段到内存,处理后再写入。修改后的代码如下:

import os

directory = '.'
# 用追加模式打开目标文件,避免每次覆盖已有内容
with open("./data/finalData.txt", "a", encoding='utf8') as w:
    for filename in os.listdir(directory):
        if filename.endswith(".txt"):
            print(f"正在处理文件:{filename}")
            with open(filename, "r", encoding='utf8') as r:
                # 每次读取4KB的块,可根据内存情况调整(比如设为1024*1024即1MB)
                chunk_size = 4096
                while True:
                    chunk = r.read(chunk_size)
                    if not chunk:
                        break  # 读取完毕,退出循环
                    # 转小写后写入目标文件
                    w.write(chunk.lower())

print("所有文件转小写处理完成!")

关键改进点说明:

  • 分块读取:用read(chunk_size)代替逐行迭代,确保每次只加载固定大小的内容到内存,彻底避免超长行导致的内存溢出。
  • 追加模式写入:把目标文件的打开操作移到循环外面,用"a"模式打开,这样所有txt文件的处理结果都会追加到同一个文件里,不会被覆盖。
  • 灵活调整块大小:chunk_size可以根据你的系统内存情况调整,内存充足的话可以设为1048576(1MB),内存紧张就用更小的数值,比如2048。

如果你的文件理论上应该有换行符,只是存在个别异常超长行,也可以尝试调整文件对象的换行符处理方式,但分块读取是更通用、更安全的超大文件处理方案。

内容的提问来源于stack exchange,提问作者Maria

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:32:23