文章摘要
SICK是一个处理JSON类数据结构的库,提供存储JSON类数据的功能。该项目在GitHub上维护,支持Maven Central发布,并持续进行构建和版本更新。
文章总结
项目名称:SICK - 独立常量键流
项目地址:https://github.com/7mind/sick
核心概念
SICK(Streams of Independent Constant Keys)是一种处理类JSON结构的创新方法,其核心优势包括:
1. 高效二进制存储:将JSON数据转换为索引化二进制格式
2. 按需访问:无需解析整个文件即可读取特定数据
3. 去重存储:支持多个JSON结构共享存储空间
技术原理
扁平化编码
通过构建值引用表实现数据结构扁平化,例如:
json
[
{"key1": "value1"},
{"key1": "value1"},
{"value1": "key1"}
]
将被编码为包含字符串、对象和数组引用的索引表,实现数据去重。
流式处理
支持通过增量更新消息实现动态数据修改(如array[1] = remove),且无删除操作时可自由重排序消息流。
二进制格式(EBA)
采用高效二进制聚合编码:
- 定长数据直接存储
- 变长数据(如字符串)使用「长度+偏移量+拼接值」结构
- 支持循环引用和自定义数据类型扩展
实现现状
| 功能 | Scala | C# | JS |
|--------------------|-------|-----|-----|
| 二进制编解码 | ✅ | ✅ | ✅ |
| 流式处理 | ❌ | ❌ | ❌ |
数据类型支持:包括基础类型(整型/浮点)、字符串、数组/对象引用、根节点等15种标记类型。
应用场景
- 企业级大型配置文件处理
- 需要低延迟读写的移动端/浏览器应用
- 已在实际百万级DAU产品中验证
限制与展望
当前限制包括单对象最大65534个键、不保留键顺序等,未来计划扩展流式处理支持并欢迎社区贡献其他语言实现。
注:项目状态更新至2025年10月,测试覆盖完善但尚无知名开源用户采用。
评论总结
以下是评论内容的总结:
对格式优势的质疑
有评论认为该格式相比JSON的流式处理优势不明显,因为JSON也可以通过分隔符实现流式解析。
"you can stream JSON just as easily because you can detect { and } delimiters"
"you can detect { and } and { and ] and " and , delimiters and know when your token is complete"对格式限制的担忧
评论指出当前实现的限制(如65534个键的最大对象大小、键顺序不保留)可能在大型应用中成为问题。
"failing at 65k keys seems like a problem people would likely hit"
"These limitations may be lifted by using more bytes to store offset pointers"潜在应用场景
有评论认为该格式可能适用于重复处理相似JSON结构的场景,如分析事件。
"useful for cases where youre repeatedly processing similar JSON structure"
"like in case of analytical events"与现有技术的比较
评论将该格式与Amazon Ion和SQLite进行比较,认为SQLite在随机访问和查询方面更具优势。
"SQLite is a really great choice...it gets you proper random access"
"there are nice GUIs for it. And you can query it"扩展性问题
有评论询问是否有计划提供当前实现之外的语言绑定。
"any plans for language bindings beyond the current implementation?"替代方案建议
评论建议使用SQLite等现有数据库技术而非自定义序列化格式。
"using sqlite instead of a custom serialisation format"
"it is trivial to represent a JSON object as DAG-CBOR"特定使用场景建议
有评论建议该格式可用于向量处理和小投影流式传输。
"Use for vectors and stream smaller projections first?"