处理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
相关产品推荐
相关产品推荐

