2 个不稳定版本
0.2.0 | 2024年5月26日 |
---|---|
0.1.0 | 2024年5月20日 |
#687 在 解析实现
58KB
1K SLoC
genson-rs
-- 🔥 在几秒钟内从千兆字节 JSON 数据中生成 JSON Schema
genson-rs
是 GenSON 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