从5万条JSON数据中提取唯一session_id记录的高效实现
高效处理5万条JSON数据,提取session_id唯一记录的方法
核心思路
用字典做session_id到最优记录的映射,一次遍历即可完成处理,时间复杂度O(n),对5万条数据来说效率拉满,内存占用也可控(仅存储每个session_id的一条最优记录)。
规则对应处理逻辑
遍历每条记录时,按以下逻辑更新字典:
- 若当前
session_id未在字典中:- 不管是
update还是insert类型,先存入字典(后续遇到update会自动替换insert)
- 不管是
- 若当前
session_id已在字典中:- 如果当前记录是
update类型:- 若字典中对应记录是
insert:直接替换成当前update记录 - 若字典中也是
update类型:比较last_interaction,当前记录时间更新的话就替换
- 若字典中对应记录是
- 如果当前记录是
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')
代码说明
- 数据加载:直接用
json.load读取整个文件,5万条数据的内存占用完全在Python的处理范围内;如果是超大规模数据(百万级以上),可以改用ijson迭代加载,但5万条没必要。 - 字典映射:
session_map始终存储每个session_id对应的最优记录,遍历过程中动态更新,无需额外排序操作。 - 结果输出:将字典的值转为列表后保存,保留格式化缩进方便查看。
示例验证
假设输入数据如下:
[ {"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
相关产品推荐
相关产品推荐

