用于查询海量流数据集的实验性 JSONPath 引擎。
rsonpath
crate 提供了一个 JSONPath 解析器和一个查询执行引擎rq
,它利用 SIMD 指令与传统引擎相比提供了巨大的吞吐量改进。
rsonpath
与 Pison 数据集上的参考 no-SIMD 引擎的基准测试。注意:刻度是对数的!
要对文件运行 JSONPath 查询,请执行:
rq '$..a.b' ./file.json
如果省略该文件,引擎将读取标准输入。 JSON 也可以内联传递:
$ rq ' $..a.b ' --json ' {"c":{"a":{"b":42}}} '
42
有关详细信息,请参阅rq --help
或 rsonbook。
运行查询的结果是一系列匹配值,以换行符分隔。或者,传递--result count
仅返回匹配数,这可能会快得多。对于其他结果模式,请参阅--help
使用页面。
请参阅所有一流支持目标的预编译二进制文件的版本。
cargo
最简单的安装方法是通过cargo
。
$ cargo install rsonpath
...
如果最大速度至关重要,您应该安装具有本机 CPU 指令支持的rsonpath
。这将导致二进制文件不可移植,并且可能在任何其他机器上无法正常工作,而且会耗尽最后一点吞吐量。
为此,请运行以下cargo install
变体:
$ RUSTFLAGS= " -C target-cpu=native " cargo install rsonpath
...
查看rsonbook中的相关章节。
该项目正在积极开发中,目前仅支持 JSONPath 查询语言的一个子集。查询是一系列段,每个段包含一个或多个选择器。
部分 | 句法 | 支持 | 自从 | 追踪问题 |
---|---|---|---|---|
儿童段(单人) | [<selector>] | ✔️ | v0.1.0 | |
子段(多个) | [<selector1>,...,<selectorN>] | |||
后代段(单) | ..[<selector>] | ✔️ | v0.1.0 | |
后代段(多个) | ..[<selector1>,...,<selectorN>] |
选择器 | 句法 | 支持 | 自从 | 追踪问题 |
---|---|---|---|---|
根 | $ | ✔️ | v0.1.0 | |
姓名 | .<member> , [<member>] | ✔️ | v0.1.0 | |
通配符 | .* , ..* , [*] | ✔️ | v0.4.0 | |
索引(数组索引) | [<index>] | ✔️ | v0.5.0 | |
索引(从末尾开始的数组索引) | [-<index>] | |||
数组切片(前向、正界) | [<start>:<end>:<step>] | ✔️ | v0.9.0 | 第152章 |
数组切片(向前、任意边界) | [<start>:<end>:<step>] | |||
数组切片(向后、任意边界) | [<start>:<end>:-<step>] | |||
过滤器——存在主义测试 | [?<path>] | 第154章 | ||
过滤器 – const 原子比较 | [?<path> <binop> <atom>] | 第156章 | ||
过滤器 – 逻辑表达式 | && , || , ! | |||
过滤器 – 嵌套 | [?<expr>[?<expr>]...] | |||
过滤器——任意比较 | [?<path> <binop> <path>] | |||
过滤器——功能扩展 | [?func(<path>)] |
该板条箱是针对所有 Tier 1 Rust 目标持续构建的,并且针对可以使用 GitHub 操作图像运行的目标持续运行测试。 SIMD 仅在 x86/x86_64 平台上受支持。
目标三重 | nosimd 构建 | SIMD支持 | 持续测试 | 追踪问题 |
---|---|---|---|---|
aarch64-未知-linux-gnu | ✔️ | ✔️ | #21,#115 | |
i686-未知-linux-gnu | ✔️ | ✔️ | ✔️ | |
x86_64-未知-linux-gnu | ✔️ | ✔️ | ✔️ | |
x86_64-苹果-达尔文 | ✔️ | ✔️ | ✔️ | |
i686-pc-windows-gnu | ✔️ | ✔️ | ✔️ | |
i686-pc-windows-msvc | ✔️ | ✔️ | ✔️ | |
x86_64-pc-windows-gnu | ✔️ | ✔️ | ✔️ | |
x86_64-pc-windows-msvc | ✔️ | ✔️ | ✔️ |
SIMD 支持是逐个模块启用的。一般来说,过去十年发布的任何 CPU 都支持 AVX2,它可以实现所有可用的优化。
具有 SSE2 或更高版本的较旧 CPU 获得部分支持。您可以使用rq --version
检查具体启用了什么 – 检查SIMD support
字段:
$ rq --version
rq 0.9.1
Commit SHA: c024e1bab89610455537b77aed249d2a05a81ed6
Features: default,simd
Opt level: 3
Target triple: x86_64-unknown-linux-gnu
Codegen flags: link-arg=-fuse-ld=lld
SIMD support: avx2;fast_quotes;fast_popcnt
fast_quotes
功能取决于pclmulqdq
指令,而fast_popcnt
取决于popcnt
指令。
并非所有选择器都受支持,请参阅上面的支持表。
引擎假设输入 JSON 中的每个对象都没有重复的键。不保证重复键上的行为稳定,但目前引擎将简单地匹配第一个这样的键。
$ rq ' $.key ' --json ' {"key":"value","key":"other value"} '
"value"
引擎不会解析成员名称中的 unicode 转义序列。这意味着键"a"
与键"u0041"
不同,即使在语义上它们表示相同的字符串。这实际上是根据当前 JSONPath 规范设计的。解析 unicode 序列的成本很高,因此为了高性能而推迟了对此的支持。这被追踪为#117。
要点是:分叉、实施、在此处制作 PR。更多详细信息请参阅贡献文档。
开发工作流程just
使用 .使用附带的Justfile
。如果它检测到您的环境中没有 Cargo,它将使用rustup
工具自动为您安装 Rust。
$ just build
...
$ just test
...
rsonpath
的基准位于单独的存储库中,作为 git 子模块包含在该主存储库中。
运行所有基准测试的最简单方法就是just bench
。有关详细信息,请查看子模块中的 README。
我们有一篇关于rsonpath
的论文将在 ASPLOS '24 上发表!您可以在这里阅读。
这个项目被认为是我的论文。您可以阅读它以详细了解引擎的理论背景及其实现细节。
显示直接依赖关系,完整图表见下文。
cargo tree --package rsonpath --edges normal --depth 1
rsonpath v0.9.1 (/home/mat/src/rsonpath/crates/rsonpath)
├── clap v4.5.4
├── color-eyre v0.6.3
├── eyre v0.6.12
├── log v0.4.21
├── rsonpath-lib v0.9.1 (/home/mat/src/rsonpath/crates/rsonpath-lib)
├── rsonpath-syntax v0.3.1 (/home/mat/src/rsonpath/crates/rsonpath-syntax)
└── simple_logger v4.3.3
[build-dependencies]
├── rustflags v0.1.5
└── vergen v8.3.1
[build-dependencies]
cargo tree --package rsonpath-lib --edges normal --depth 1
rsonpath-lib v0.9.1 (/home/mat/src/rsonpath/crates/rsonpath-lib)
├── arbitrary v1.3.2
├── cfg-if v1.0.0
├── log v0.4.21
├── memmap2 v0.9.4
├── nom v7.1.3
├── rsonpath-syntax v0.3.1 (/home/mat/src/rsonpath/crates/rsonpath-syntax)
├── smallvec v1.13.2
├── static_assertions v1.1.0
├── thiserror v1.0.58
└── vector-map v1.0.1
clap
– 提供 CLI 的标准 crate。color-eyre
、 eyre
– 解析器更容易访问的错误消息。log
, simple-logger
– 编译和执行期间的诊断日志。cfg-if
– 用于支持 SIMD 和 no-SIMD 版本。memmap2
– 通过内存映射而不是缓冲副本快速读取源文件。nom
– 用于解析器实现。smallvec
– 对于小堆栈性能至关重要。static_assertions
– 通过在编译时验证的一些常量假设来提高可靠性。thiserror
– 惯用的Error
实现。vector_map
– 在查询编译器中使用,可显着提高性能。 cargo tree --package rsonpath --edges normal
rsonpath v0.9.1 (/home/mat/src/rsonpath/crates/rsonpath)
├── clap v4.5.4
│ ├── clap_builder v4.5.2
│ │ ├── anstream v0.6.13
│ │ │ ├── anstyle v1.0.6
│ │ │ ├── anstyle-parse v0.2.3
│ │ │ │ └── utf8parse v0.2.1
│ │ │ ├── anstyle-query v1.0.2
│ │ │ │ └── windows-sys v0.52.0
│ │ │ │ └── windows-targets v0.52.4
│ │ │ │ ├── windows_aarch64_gnullvm v0.52.4
│ │ │ │ ├── windows_aarch64_msvc v0.52.4
│ │ │ │ ├── windows_i686_gnu v0.52.4
│ │ │ │ ├── windows_i686_msvc v0.52.4
│ │ │ │ ├── windows_x86_64_gnu v0.52.4
│ │ │ │ ├── windows_x86_64_gnullvm v0.52.4
│ │ │ │ └── windows_x86_64_msvc v0.52.4
│ │ │ ├── anstyle-wincon v3.0.2
│ │ │ │ ├── anstyle v1.0.6
│ │ │ │ └── windows-sys v0.52.0 (*)
│ │ │ ├── colorchoice v1.0.0
│ │ │ └── utf8parse v0.2.1
│ │ ├── anstyle v1.0.6
│ │ ├── clap_lex v0.7.0
│ │ ├── strsim v0.11.1
│ │ └── terminal_size v0.3.0
│ │ ├── rustix v0.38.32
│ │ │ ├── bitflags v2.5.0
│ │ │ ├── errno v0.3.8
│ │ │ │ ├── libc v0.2.153
│ │ │ │ └── windows-sys v0.52.0 (*)
│ │ │ ├── libc v0.2.153
│ │ │ ├── linux-raw-sys v0.4.13
│ │ │ └── windows-sys v0.52.0 (*)
│ │ └── windows-sys v0.48.0
│ │ └── windows-targets v0.48.5
│ │ ├── windows_aarch64_gnullvm v0.48.5
│ │ ├── windows_aarch64_msvc v0.48.5
│ │ ├── windows_i686_gnu v0.48.5
│ │ ├── windows_i686_msvc v0.48.5
│ │ ├── windows_x86_64_gnu v0.48.5
│ │ ├── windows_x86_64_gnullvm v0.48.5
│ │ └── windows_x86_64_msvc v0.48.5
│ └── clap_derive v4.5.4 (proc-macro)
│ ├── heck v0.5.0
│ ├── proc-macro2 v1.0.79
│ │ └── unicode-ident v1.0.12
│ ├── quote v1.0.35
│ │ └── proc-macro2 v1.0.79 (*)
│ └── syn v2.0.58
│ ├── proc-macro2 v1.0.79 (*)
│ ├── quote v1.0.35 (*)
│ └── unicode-ident v1.0.12
├── color-eyre v0.6.3
│ ├── backtrace v0.3.71
│ │ ├── addr2line v0.21.0
│ │ │ └── gimli v0.28.1
│ │ ├── cfg-if v1.0.0
│ │ ├── libc v0.2.153
│ │ ├── miniz_oxide v0.7.2
│ │ │ └── adler v1.0.2
│ │ ├── object v0.32.2
│ │ │ └── memchr v2.7.2
│ │ └── rustc-demangle v0.1.23
│ │ [build-dependencies]
│ │ └── cc v1.0.90
│ ├── eyre v0.6.12
│ │ ├── indenter v0.3.3
│ │ └── once_cell v1.19.0
│ ├── indenter v0.3.3
│ ├── once_cell v1.19.0
│ └── owo-colors v3.5.0
├── eyre v0.6.12 (*)
├── log v0.4.21
├── rsonpath-lib v0.9.1 (/home/mat/src/rsonpath/crates/rsonpath-lib)
│ ├── cfg-if v1.0.0
│ ├── log v0.4.21
│ ├── memmap2 v0.9.4
│ │ └── libc v0.2.153
│ ├── nom v7.1.3
│ │ ├── memchr v2.7.2
│ │ └── minimal-lexical v0.2.1
│ ├── rsonpath-syntax v0.3.1 (/home/mat/src/rsonpath/crates/rsonpath-syntax)
│ │ ├── nom v7.1.3 (*)
│ │ ├── owo-colors v4.0.0
│ │ ├── thiserror v1.0.58
│ │ │ └── thiserror-impl v1.0.58 (proc-macro)
│ │ │ ├── proc-macro2 v1.0.79 (*)
│ │ │ ├── quote v1.0.35 (*)
│ │ │ └── syn v2.0.58 (*)
│ │ └── unicode-width v0.1.11
│ ├── smallvec v1.13.2
│ ├── static_assertions v1.1.0
│ ├── thiserror v1.0.58 (*)
│ └── vector-map v1.0.1
│ ├── contracts v0.4.0 (proc-macro)
│ │ ├── proc-macro2 v1.0.79 (*)
│ │ ├── quote v1.0.35 (*)
│ │ └── syn v1.0.109
│ │ ├── proc-macro2 v1.0.79 (*)
│ │ ├── quote v1.0.35 (*)
│ │ └── unicode-ident v1.0.12
│ └── rand v0.7.3
│ ├── getrandom v0.1.16
│ │ ├── cfg-if v1.0.0
│ │ ├── libc v0.2.153
│ │ └── wasi v0.9.0+wasi-snapshot-preview1
│ ├── libc v0.2.153
│ ├── rand_chacha v0.2.2
│ │ ├── ppv-lite86 v0.2.17
│ │ └── rand_core v0.5.1
│ │ └── getrandom v0.1.16 (*)
│ ├── rand_core v0.5.1 (*)
│ └── rand_hc v0.2.0
│ └── rand_core v0.5.1 (*)
├── rsonpath-syntax v0.3.1 (/home/mat/src/rsonpath/crates/rsonpath-syntax) (*)
└── simple_logger v4.3.3
├── colored v2.1.0
│ ├── lazy_static v1.4.0
│ └── windows-sys v0.48.0 (*)
├── log v0.4.21
├── time v0.3.34
│ ├── deranged v0.3.11
│ │ └── powerfmt v0.2.0
│ ├── itoa v1.0.11
│ ├── libc v0.2.153
│ ├── num-conv v0.1.0
│ ├── num_threads v0.1.7
│ │ └── libc v0.2.153
│ ├── powerfmt v0.2.0
│ ├── time-core v0.1.2
│ └── time-macros v0.2.17 (proc-macro)
│ ├── num-conv v0.1.0
│ └── time-core v0.1.2
└── windows-sys v0.48.0 (*)
[build-dependencies]
├── rustflags v0.1.5
└── vergen v8.3.1
├── anyhow v1.0.81
├── cargo_metadata v0.18.1
│ ├── camino v1.1.6
│ │ └── serde v1.0.197
│ │ └── serde_derive v1.0.197 (proc-macro)
│ │ ├── proc-macro2 v1.0.79 (*)
│ │ ├── quote v1.0.35 (*)
│ │ └── syn v2.0.58 (*)
│ ├── cargo-platform v0.1.8
│ │ └── serde v1.0.197 (*)
│ ├── semver v1.0.22
│ │ └── serde v1.0.197 (*)
│ ├── serde v1.0.197 (*)
│ ├── serde_json v1.0.115
│ │ ├── itoa v1.0.11
│ │ ├── ryu v1.0.17
│ │ └── serde v1.0.197 (*)
│ └── thiserror v1.0.58 (*)
├── cfg-if v1.0.0
├── regex v1.10.4
│ ├── aho-corasick v1.1.3
│ │ └── memchr v2.7.2
│ ├── memchr v2.7.2
│ ├── regex-automata v0.4.6
│ │ ├── aho-corasick v1.1.3 (*)
│ │ ├── memchr v2.7.2
│ │ └── regex-syntax v0.8.3
│ └── regex-syntax v0.8.3
├── rustc_version v0.4.0
│ └── semver v1.0.22 (*)
└── time v0.3.34
├── deranged v0.3.11 (*)
├── itoa v1.0.11
├── libc v0.2.153
├── num-conv v0.1.0
├── num_threads v0.1.7 (*)
├── powerfmt v0.2.0
└── time-core v0.1.2
[build-dependencies]
└── rustversion v1.0.14 (proc-macro)