如何高效解析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
相关产品推荐
相关产品推荐

