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

Python读取最大4GB文件触发MemoryError问题解决方案求助

报错原因

该MemoryError触发在关键词文件读取阶段,你调用的read()方法会一次性将整个file2.txt的内容加载到内存,当关键词文件体积超过当前Python进程可用内存阈值时就会抛出错误。此外如果待匹配的file1.txt存在单条长度超过内存的超长行,原有逐行读取逻辑也可能二次触发内存溢出。

修复方案

1. 优化关键词加载逻辑

放弃一次性全量读取关键词文件,改为逐行加载,同时用集合存储关键词实现去重,还能提升后续匹配的查询效率:

keywords = set()
# 可根据实际文件编码调整encoding参数,如gbk、latin-1等
with open('file2.txt', 'r', encoding='utf-8') as k:
    for line in k:
        keyword = line.strip()
        # 跳过无效空行
        if keyword:
            keywords.add(keyword)

2. 兼容超大待匹配文件

原有for line in f逐行读取逻辑仅适合单行长度可控的文件,如果file1.txt存在超长单行内容,可以改为固定缓冲区大小分块读取、按行分隔符切割后再匹配,完全避免内存溢出:

# 单次读取缓冲区大小设为8MB,可根据可用内存灵活调整
BUFFER_SIZE = 1024 * 1024 * 8
# 行分隔符,Windows环境下可调整为'\r\n'
line_sep = '\n'
# 存储上一次读取剩余的不完整行内容
remainder = ''

with open('file1.txt', 'r', encoding='utf-8') as f, open('output.txt', 'w', encoding='utf-8') as o:
    while True:
        buffer = f.read(BUFFER_SIZE)
        # 文件读取完成,退出循环
        if not buffer:
            # 处理最后剩余的内容
            if remainder and any(key in remainder for key in keywords):
                o.write(remainder)
            break
        # 拼接上一次剩余的不完整行
        full_content = remainder + buffer
        lines = full_content.split(line_sep)
        # 取出本次切割后剩余的不完整行,留到下次拼接
        remainder = lines.pop()
        # 批量处理所有完整行
        for line in lines:
            if any(key in line for key in keywords):
                o.write(line + line_sep)

3. 高关键词量场景效率优化

如果关键词量级超过10万,原有逐个遍历关键词匹配的方式效率极低,可以改用Aho-Corasick多模式匹配算法,Python生态可通过pyahocorasick库实现,匹配速度可提升数十倍。
匹配逻辑替换示例:

import ahocorasick

# 构建AC自动机
automaton = ahocorasick.Automaton()
for idx, keyword in enumerate(keywords):
    automaton.add_word(keyword, (idx, keyword))
automaton.make_automaton()

# 匹配判断逻辑替换为
if any(automaton.iter(line)):
    o.write(line + line_sep)

极端场景补充

如果关键词文件体积确实超过可用内存上限,无法全量加载到内存,可采用关键词分批次加载、待匹配文件多轮遍历的方式处理,仅会增加磁盘IO开销,不会触发内存溢出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 16:57:02