محرك JSONPath التجريبي للاستعلام عن مجموعات البيانات المتدفقة الضخمة.
يوفر صندوق rsonpath
محلل JSONPath ومحرك تنفيذ الاستعلام rq
، الذي يستخدم تعليمات SIMD لتوفير تحسينات هائلة في الإنتاجية مقارنة بالمحركات التقليدية.
معايير rsonpath
مقابل محرك مرجعي بدون SIMD في مجموعة بيانات Pison. ملحوظة: المقياس لوغاريتمي!
لتشغيل استعلام 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
...
إذا كانت السرعة القصوى أمرًا بالغ الأهمية، فيجب عليك تثبيت 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 | ||
المرشحات – مقارنات الذرة الثابتة | [?<path> <binop> <atom>] | #156 | ||
المرشحات - التعبيرات المنطقية | && ، || ، ! | |||
المرشحات - التعشيش | [?<expr>[?<expr>]...] | |||
المرشحات – مقارنات تعسفية | [?<path> <binop> <path>] | |||
المرشحات – ملحقات الوظيفة | [?func(<path>)] |
تم تصميم الصندوق بشكل مستمر لجميع أهداف Tier 1 Rust، ويتم إجراء الاختبارات بشكل مستمر للأهداف التي يمكن تشغيلها باستخدام صور الحركة GitHub. يتم دعم SIMD فقط على الأنظمة الأساسية x86/x86_64.
الهدف الثلاثي | nosimd build | دعم SIMD | الاختبار المستمر | مشاكل التتبع |
---|---|---|---|---|
aarch64-unknown-linux-gnu | ✔️ | ✔️ | #21، #115 | |
i686-غير معروف-لينكس-جنو | ✔️ | ✔️ | ✔️ | |
x86_64-غير معروف-لينكس-جنو | ✔️ | ✔️ | ✔️ | |
x86_64-أبل-داروين | ✔️ | ✔️ | ✔️ | |
i686-pc-windows-gnu | ✔️ | ✔️ | ✔️ | |
i686-كمبيوتر-ويندوز-msvc | ✔️ | ✔️ | ✔️ | |
x86_64-pc-windows-gnu | ✔️ | ✔️ | ✔️ | |
x86_64-pc-windows-msvc | ✔️ | ✔️ | ✔️ |
يتم تمكين دعم SIMD على أساس كل وحدة على حدة. بشكل عام، أي وحدة معالجة مركزية تم إصدارها في العقد الماضي تدعم AVX2، الذي يتيح كافة التحسينات المتاحة.
تحصل وحدات المعالجة المركزية الأقدم المزودة بـ SSE2 أو أعلى على دعم جزئي. يمكنك التحقق مما تم تمكينه بالضبط باستخدام 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.
الجوهر هو: شوكة، تنفيذ، إجراء علاقات عامة هنا. مزيد من التفاصيل موجودة في مستند المساهمة.
just
سير عمل التطوير . استخدم Justfile
المضمن. سيقوم تلقائيًا بتثبيت Rust لك باستخدام أداة rustup
إذا اكتشف عدم وجود حمولة في بيئتك.
$ 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 و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)