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

高效解析百万级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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 08:33:26