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

如何解决两个列表数据过滤时出现的内存错误

解决大文件合并时的内存溢出问题

问题根源

  1. 内存过载:直接用read()读取2.5GB文件到内存,即使64位Python也会瞬间占用大量内存,触发MemoryError。
  2. 低效遍历:双重循环遍历两个大列表,时间复杂度为O(n*m),不仅运行极慢,还会在遍历过程中持续占用内存。
  3. 字段不匹配:代码中用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 15:06:29