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

从5万条JSON数据中提取唯一session_id记录的高效实现

高效处理5万条JSON数据,提取session_id唯一记录的方法

核心思路

用字典做session_id到最优记录的映射,一次遍历即可完成处理,时间复杂度O(n),对5万条数据来说效率拉满,内存占用也可控(仅存储每个session_id的一条最优记录)。

规则对应处理逻辑

遍历每条记录时,按以下逻辑更新字典:

  • 若当前session_id未在字典中:
    • 不管是update还是insert类型,先存入字典(后续遇到update会自动替换insert)
  • 若当前session_id已在字典中:
    1. 如果当前记录是update类型:
      • 若字典中对应记录是insert:直接替换成当前update记录
      • 若字典中也是update类型:比较last_interaction,当前记录时间更新的话就替换
    2. 如果当前记录是insert类型:直接跳过(规则要求优先update,忽略insert)

完整Python代码

import json

def process_session_data(input_file, output_file):
    # 加载JSON数据
    with open(input_file, 'r', encoding='utf-8') as f:
        data = json.load(f)
    
    session_map = {}
    
    for record in data:
        session_id = record['session_id']
        current_type = record['type']
        current_last_interaction = record['last_interaction']
        
        if session_id not in session_map:
            # 首次出现的session,直接存入字典
            session_map[session_id] = record
        else:
            existing_record = session_map[session_id]
            existing_type = existing_record['type']
            
            if current_type == 'update':
                if existing_type == 'insert':
                    # 用update类型替换insert类型,符合规则优先级
                    session_map[session_id] = record
                else:
                    # 同是update类型,保留最新的last_interaction记录
                    if current_last_interaction > existing_record['last_interaction']:
                        session_map[session_id] = record
            # 若当前是insert类型,直接跳过不处理
    
    # 将字典中的最优记录转为列表
    result = list(session_map.values())
    
    # 保存处理后的结果到文件
    with open(output_file, 'w', encoding='utf-8') as f:
        json.dump(result, f, indent=2, ensure_ascii=False)

# 调用示例(替换成你的输入输出文件路径)
process_session_data('input.json', 'output.json')

代码说明

  1. 数据加载:直接用json.load读取整个文件,5万条数据的内存占用完全在Python的处理范围内;如果是超大规模数据(百万级以上),可以改用ijson迭代加载,但5万条没必要。
  2. 字典映射:session_map始终存储每个session_id对应的最优记录,遍历过程中动态更新,无需额外排序操作。
  3. 结果输出:将字典的值转为列表后保存,保留格式化缩进方便查看。

示例验证

假设输入数据如下:

[
    {"session_id": "s1", "type": "insert", "last_interaction": "2024-01-01 10:00:00", "content": "a"},
    {"session_id": "s1", "type": "update", "last_interaction": "2024-01-01 11:00:00", "content": "b"},
    {"session_id": "s2", "type": "update", "last_interaction": "2024-01-01 09:00:00", "content": "c"},
    {"session_id": "s2", "type": "update", "last_interaction": "2024-01-01 12:00:00", "content": "d"},
    {"session_id": "s3", "type": "insert", "last_interaction": "2024-01-01 13:00:00", "content": "e"}
]

处理后输出结果:

[
    {"session_id": "s1", "type": "update", "last_interaction": "2024-01-01 11:00:00", "content": "b"},
    {"session_id": "s2", "type": "update", "last_interaction": "2024-01-01 12:00:00", "content": "d"},
    {"session_id": "s3", "type": "insert", "last_interaction": "2024-01-01 13:00:00", "content": "e"}
]

完全符合规则:s1用了update类型记录,s2保留了最新的update记录,s3无update记录则保留唯一的insert记录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 22:09:24