大規模なストリーミング データセットをクエリするための実験的な JSONPath エンジン。
rsonpath
クレートは、JSONPath パーサーとクエリ実行エンジンrq
提供します。これらは SIMD 命令を利用して、従来のエンジンに比べてスループットを大幅に向上させます。
Pison データセット上の参照 no-SIMD エンジンに対するrsonpath
のベンチマーク。注: スケールは対数です。
ファイルに対して 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 クエリ言語のサブセットのみをサポートしています。クエリは一連のセグメントであり、各セグメントには 1 つ以上のセレクターが含まれます。
セグメント | 構文 | サポートされています | 以来 | 追跡問題 |
---|---|---|---|---|
子セグメント(単一) | [<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 サポートはモジュールごとに有効になります。一般に、過去 10 年間にリリースされた CPU はすべて AVX2 をサポートしており、利用可能なすべての最適化が可能です。
SSE2 以降の古い CPU は部分的にサポートされます。 rq --version
で何が有効になっているかを正確に確認できます。SIMD 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 を提供する標準クレート。color-eyre
、 eyre
– パーサーのよりアクセスしやすいエラー メッセージ。log
、 simple-logger
– コンパイルおよび実行中の診断ログ。cfg-if
– SIMD バージョンと 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)