高效解析百万级JSON长字符串并聚合矿物数量的优化方案问询
批量JSON数据聚合优化需求
需求目标
我有数千份数据转储文件,解压后是包含15万条以\n分隔的JSON的长字符串,示例如下:
big_string = '{"mineral": "gold", "qty": 2, "garbage":"abc"}\n.......{"mineral": "silver", "qty": 4}'
每个JSON包含大量如garbage的无用键,仅需按mineral维度汇总qty值,预期结果示例:
result = {'gold': 213012, 'silver': 123451, 'adamantium': 321434}
复现方法
可通过以下代码生成测试数据:
import random minerals = ['gold', 'silver', 'adamantium'] big_string = str( '\n'.join([ str({'mineral': random.choice(minerals), 'qty': random.randint(1,1000), 'garbage': random.randint(1,666), 'other_garbage': random.randint(-10,10)}) for _ in range(150000) ]) ) def solution(big_string): # Show me your move return dict() # or pd.DataFrame()
当前方案(效率未达预期)
当前采用的处理步骤:
- 使用生成器通过
\n分割长字符串 - 借助ujson库加载JSON字符串(性能优于标准json库)
- 提取仅需的
mineral和qty字段 - 利用pandas完成聚合计算
具体代码:
import ujson import re import pandas as pd # 分割长字符串 def lines(string, sep="\s+"): # 注意:若分隔符为(?=b)这类前瞻表达式,当前实现暂不支持 if sep=='': return (c for c in string) else: return (_.group(1) for _ in re.finditer(f'(?:^|{sep})((?:(?!{sep}).)*)', string)) def my_solution(big_string): useful_fields = ['mineral', 'qty'] filtered_data = [] for line in lines(big_string, sep="\n"): line = ujson.loads(line) filtered_data.append([line[field] for field in useful_fields]) result = pd.DataFrame(filtered_data, columns = useful_fields) return result.groupby('mineral')['qty'].sum().reset_index()
因需处理数千份此类文件,寻求可将效率提升至少25%的优化方案。
内容的提问来源于stack exchange,提问作者Vincent
相关产品推荐
相关产品推荐

