#json-schema #json #schema #json-object #inference #generate-json #genson

bin+lib genson-rs

由 Rust 编写的极快 JSON Schema 推断引擎

2 个不稳定版本

0.2.0 2024年5月26日
0.1.0 2024年5月20日

#687解析实现

自定义许可证

58KB
1K SLoC

genson-rs

CodSpeed Badge crates.io CI

-- 🔥 在几秒钟内从千兆字节 JSON 数据中生成 JSON Schema

genson-rsGenSON Python 库的 Rust 重写,它可以用来从单个或多个 JSON 对象生成 JSON 模式 (Draft-04 及以后版本)。

尽管目前尚未完全具备所有功能,但 genson-rs 专注于 速度 ⚡️。与 Python GenSON 库相比,它提供了更好的性能(25x ~ 75x 更快),并且通常比其他开源模式推断工具也要快得多。其高性能使其成为大型 JSON 数据集在线模式推断的可行选择。查看性能基准比较部分。

安装

通过 Cargo 安装是最简单的。如果您还没有,请点击链接设置 Cargo(只需一个简单命令),然后运行

cargo install genson-rs

很快将支持通过 brew 安装。

用法

genson-rs <OPTION> <FILE>

例如,如果您有一个包含 JSON 格式请求日志的大型 JSON 文件

genson-rs request_logs.json

另外,如果每个请求日志都是单独一行中的 JSON 对象,您可以指定分隔符,这将略微提高性能

genson-rs --delimiter newline request_logs.json 

基准测试

以下基准测试是在我的本地 2023 年 Macbook Pro(搭载 M2 Pro 芯片 (10 核心 4 高效-性能+ 6 高性能-性能) 16GB RAM 运行 macOS 13.0 上手动执行的。每个测试 JSON 文件都使用位于 tests/data 文件夹中的 json_gen.py 脚本生成,并且每个测试都执行了 3 次。使用了 3 次运行的中位数。

文件大小 时间
GenSON (Python) 50 MB 1.61s
genson-rs 50 MB 🔥 0.07s
GenSON (Python) 500 MB 16.07s
genson-rs 500 MB 🔥 0.61s
GenSON (Python) 1 GB 34.21s
genson-rs 1 GB 🔥 1.19s
GenSON (Python) 3 GB 107.86s (1分47秒)
genson-rs 3 GB 🔥 4.56s
GenSON (Python) 3 GB (大型 JSON 数组) 443.83s (7分23秒)
genson-rs 3 GB (大型 JSON 数组) 🔥 7.06s

如你所见,genson-rs 非常快,根据我对其他工具(我所知)的初步基准测试,可能是最快的模式推断引擎。

优化技术

genson-rs 库利用以下技术来极大地加快模式生成过程

  • ⚡️ Rust 本身就非常快 -- 没有任何 GC 或解释器开销,在单个 CPU 核心上运行的 1-to-1 端口比 Python 版本快 2 倍
  • ⚡️ 利用所有可用 CPU 核心的并行处理 -- 虽然 Python 有 GIL 的限制,阻止它有效地利用多个 CPU 核心执行,但 genson-rs 在可能的情况下并行化 Map-Reduce 类型的负载(例如处理巨大的数组),最大程度地利用所有可用的 CPU 核心
  • ⚡️ 由 SIMD 指令提供的高速 JSON 解析 -- 我们不解析整个 JSON 数据集,而是使用 simd-json 库(C++ simdjson 库的 Rust 端口),它利用 SIMD(单指令/多数据)指令仅解析 JSON 数据集的“带子”,这对于在无需完全反序列化整个数据集的情况下构建模式是足够的
  • ⚡️ 使用 MiMalloc 分配器进行高效的内存管理 -- 这是 simd-json 库本身推荐的,genson-rs 选择使用 MiMalloc 分配器而不是默认的全局分配器,这使得代码运行速度快了很多

依赖项

~13MB
~226K SLoC