用於查詢海量流資料集的實驗性 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)