如何解决两个列表数据过滤时出现的内存错误
解决大文件合并时的内存溢出问题
问题根源
- 内存过载:直接用
read()读取2.5GB文件到内存,即使64位Python也会瞬间占用大量内存,触发MemoryError。 - 低效遍历:双重循环遍历两个大列表,时间复杂度为O(n*m),不仅运行极慢,还会在遍历过程中持续占用内存。
- 字段不匹配:代码中用
x.get('id')(小写),但数据里的字段是ID(大写),导致匹配逻辑完全失效。
优化方案
核心思路是流式处理+哈希映射:
- 先遍历
fileItems.js,构建ID -> 完整对象的字典映射,同时给每个对象初始化data空列表(用于收集fileMain中对应ID的条目)。 - 流式读取
fileMain.js,逐条解析每个对象,根据ID找到映射中的对象,把当前对象的非ID字段添加到data列表中。 - 最后把映射中的所有对象写入结果文件。
注意:fileItems.js是JS对象格式(键和字符串无引号),需要用支持JS语法的解析库处理,或先预处理转成标准JSON。
代码实现
1. 安装依赖
pip install demjson ijson
2. 优化后的代码
import demjson import ijson # 处理fileItems,构建ID映射并初始化data列表 id_map = {} with open('fileItems.js', 'r', encoding='utf-8') as f: content = f.read() # 移除单行注释 content = '\n'.join(line for line in content.split('\n') if not line.strip().startswith('//')) # 解析JS数组 file_items = demjson.decode(content) for item in file_items: item_id = item['ID'] item['data'] = [] id_map[item_id] = item # 流式处理fileMain,逐条添加到对应ID的data中 with open('fileMain.js', 'r', encoding='utf-8') as f: # 流式解析JSON数组,避免加载整个文件到内存 parser = ijson.items(f, 'item') for main_item in parser: main_id = main_item['ID'] if main_id in id_map: # 提取非ID字段添加到data data_item = {k: v for k, v in main_item.items() if k != 'ID'} id_map[main_id]['data'].append(data_item) # 将结果写入JS格式文件 with open('allData.js', 'w', encoding='utf-8') as f: result_list = list(id_map.values()) f.write(demjson.encode(result_list, js=True))
额外优化点
- 若
fileItems.js也大到无法一次性解析,可结合ijson与demjson做流式处理,先处理JS格式的语法问题(如无引号的键)。 - 可分批次处理
fileMain.js,进一步降低内存占用。 - 确保文件编码一致,避免解析错误。
内容的提问来源于stack exchange,提问作者Mogma
相关产品推荐
相关产品推荐

