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

如何高效解析JSON并存储到Chronicle Map?能否直接存储字节?

从JSON解析值到Chronicle Map的优化方案

可以跳过显式转换为long的步骤,直接将目标字段的字节存储到Chronicle Map中,但需要调整Map的value类型并适配JSON解析逻辑,具体实现如下:

关键调整点

  • 修改Chronicle Map的value类型:放弃Long类型,改用Chronicle原生的BytesStore(推荐,性能最优)或普通byte[],用于直接存储字节数据。
  • 直接提取JSON字段的字节片段:利用JSONWire的API获取目标字段对应的原始字节,无需经过readLong()转换步骤。

优化后的代码示例

方案1:使用Chronicle BytesStore(推荐)

String data = ...;
// 定义Map的value类型为BytesStore
ChronicleMap<CharSequence, BytesStore> map = ChronicleMapBuilder
        .of(CharSequence.class, BytesStore.class)
        .averageKeySize(10)
        .averageValueSize(8) // long类型固定8字节,可预先设置
        .entries(10000)
        .createOrRecoverPersistedTo(new File("your-map-path"));

JSONWire wire = new JSONWire(Bytes.allocateElasticDirect(128));
wire.bytes().append(data);

// 直接获取目标字段的字节并拷贝到BytesStore,无需转long
BytesStore valueBytes = wire.read("fieldName").bytes().copy();
map.put("key", valueBytes);

方案2:使用普通byte[]

String data = ...;
// 定义Map的value类型为byte[]
ChronicleMap<CharSequence, byte[]> map = ChronicleMapBuilder
        .of(CharSequence.class, byte[].class)
        .averageKeySize(10)
        .averageValueSize(8)
        .entries(10000)
        .createOrRecoverPersistedTo(new File("your-map-path"));

JSONWire wire = new JSONWire(Bytes.allocateElasticDirect(128));
wire.bytes().append(data);

Bytes valueBytes = wire.read("fieldName").bytes();
byte[] byteArr = new byte[valueBytes.readRemaining()];
valueBytes.read(byteArr);
map.put("key", byteArr);

注意事项

  • 必须确保JSON中fieldName对应的内容是合法的数字字符序列,否则后续从Map读取字节转long时会抛出解析异常。
  • 使用BytesStore能减少额外的字节拷贝操作,更贴合Chronicle的内存模型,写入和读取性能都会优于byte[]。
  • 读取Map中的数据时,仍需要将字节转换为long类型(比如通过Bytes.wrap(valueBytes).readLong()),但这一步延迟到了读取阶段,降低了写入时的性能开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 14:05:21