Jak dynamicky načítaná SQLite rozšíření v C a Rustu zrychlují lokální zpracování dat, vektorové vyhledávání a provoz AI agentů.
Pro desktopové agenty, jako jsou AnythingLLM či Cursor, i pro nástroje na příkazové řádce představují vestavěné in-process vektorové databáze často jedinou schůdnou architekturu[1]. Spouštění vektorového vyhledávání přímo v procesu aplikace eliminuje síťovou latenci mezi datacentry, která se běžně pohybuje mezi 15 a 50 milisekundami[2]. Dynamicky načítaná SQLite rozšíření jsou kompilované dynamické knihovny s příponami .dylib, .so nebo .dll[3].
C versus Rust: Porovnání velikosti a parsování
Simon Willison testoval vytvoření uživatelské SQLite funkce parse_number() v jazycích C a Rust za pomoci modelu Claude Opus 5.5[4]. Zkompilované SQLite rozšíření v jazyce Rust dosáhlo velikosti 321 KB s knihovnou Rusqlite a 298 KB s sqlite-loadable-rs, zatímco rozšíření v jazyce C mělo pouhých 14 KB[5].
Rozšíření v jazyce Rust však bylo rychlejší než verze v C, protože implementace parsování čísel v Rustu je dvakrát rychlejší než funkce strtod v jazyce C[6].
Možnosti a výkon frameworku sqlite-loadable-rs
Knihovna sqlite-loadable-rs představuje framework pro tvorbu načítatelných SQLite rozšíření v jazyce Rust inspirovaný projekty rusqlite, pgx a knihovnou pro Go od Riyaze Aliho[7]. Framework sqlite-loadable-rs umožňuje vytvářet virtuální tabulky přes define_virtual_table[8].
Knihovna sqlite-loadable-rs silně spoléhá na nativní C API SQLite, což si v implementaci v Rustu vyžaduje použití unsafe bloků[9]. Rozšíření hello world postavené na sqlite-loadable-rs je zhruba o 10 až 15 procent pomalejší než varianta v C, avšak 20krát až 30krát rychlejší než v jazyce Go[10].
Při specifických operacích navíc Rust dosahuje vyššího výkonu než C: rozšíření sqlite-xsv napsané v Rustu je 1,5krát až 1,7krát rychlejší než oficiální CSV rozšíření SQLite napsané v C a sqlite-regex je dvakrát rychlejší než původní rozšíření regexp[11].
In-process vyhledávání: sqlite-vec a LanceDB
Pro práci s vektory napsal Alex Garcia rozšíření sqlite-vec v čistém přenositelném jazyce C bez externích závislostí jako náhradu za sqlite-vss vyžadující knihovnu Faiss v C++[12]. Knihovna sqlite-vec provádí skenování vektorů přímo pomocí SIMD instrukcí procesoru AVX2, AVX-512 a ARM NEON místo stavby paměťově náročných grafových indexů[13].
Při použití SIMD instrukcí AVX2 zvládne sqlite-vec sekvenční vyhledávání v kolekci 100 000 vektorů za 5 až 15 milisekund[14]. Rozšíření sqlite-vec navíc podporuje jednobitovou binární kvantizaci, která zmenšuje velikost vektorů 32krát a umožňuje výpočet vzdáleností hardwarovými operacemi XOR a popcount[15].
Vektorové vyhledávání v sqlite-vec lze díky integraci přímo v SQLite propojovat s relačními tabulkami v rámci standardních ACID transakcí[16]. Pro další náročné scénáře je k dispozici také vektorová databáze LanceDB, která je postavena v jazyce Rust nad formátem Lance určeným pro multimodální AI a práci se sloupcovými daty[17].
Knihovna sqlite-loadable-rs je framework pro tvorbu načítatelných SQLite rozšíření v jazyce Rust inspirovaný projekty rusqlite, pgx a knihovnou pro Go od Riyaze Aliho.
sqlite-loadable-rs
A framework for building loadable SQLite extensions in Rust. Inspired by rusqlite, pgx, and Riyaz Ali’s similar SQLite Go library.
docs.rsOtevřít zdroj
Při použití SIMD instrukcí AVX2 zvládne sqlite-vec sekvenční vyhledávání v kolekci 100 000 vektorů za 5 až 15 milisekund.
For small to medium collections (under 100,000 vectors), flat SIMD scans bypass indexing overhead entirely. At 100k vectors, a brute-force AVX2 scan executes in 5-15 milliseconds.
llms.blogOtevřít zdroj
Rozšíření sqlite-xsv napsané v Rustu je 1,5krát až 1,7krát rychlejší než oficiální CSV rozšíření SQLite napsané v C a sqlite-regex je dvakrát rychlejší než původní rozšíření regexp.
sqlite-xsv is 1.5-1.7x faster than the “offical” CSV SQLite extension written in C, and sqlite-regex is 2x faster than the regexp extension.
docs.rsOtevřít zdroj
Vektorová databáze LanceDB je postavena v jazyce Rust nad formátem Lance, který je určen pro multimodální AI a práci se sloupcovými daty.
LanceDB is built in Rust on top of the open-source Lance file format, a modern columnar format engineered specifically for multimodal AI and vector retrieval.
llms.blogOtevřít zdroj
Simon Willison testoval vytvoření uživatelské SQLite funkce parse_number() v jazycích C a Rust za pomoci modelu Claude Opus 5.5.
I fired up regular Claude chat (Opus 5.5) and prompted:
I'm thinking about a SQLite custom function 'parse_number(value)' that strips ',', '$', '£' and '%', handles a leading '-', and returns 'NULL' for anything it can’t parse
simonwillison.netOtevřít zdroj
Zkompilované SQLite rozšíření v jazyce Rust dosáhlo velikosti 321 KB s knihovnou Rusqlite a 298 KB s sqlite-loadable-rs, zatímco rozšíření v jazyce C mělo 14 KB.
This gave me a solid starting point - the Rust extension was 321 KB (using Rusqlite) and 298 KB (using sqlite-loadable-rs), while the C extension was 14 KB.
simonwillison.netOtevřít zdroj
Rozšíření v jazyce Rust bylo zpočátku rychlejší než verze v C, protože implementace parsování čísel v Rustu je dvakrát rychlejší než funkce strtod v jazyce C.
But the Rust extension was faster!
Turns out that's because the Rust equivalent of C's strtod is "twice as fast".
simonwillison.netOtevřít zdroj
Knihovna sqlite-vec provádí skenování vektorů přímo pomocí SIMD instrukcí procesoru AVX2, AVX-512 a ARM NEON místo stavby paměťově náročných grafových indexů.
Rather than building complex graph indices that require substantial indexing time and memory overhead, sqlite-vec implements highly optimized flat scans using AVX2, AVX-512, and ARM NEON intrinsics.
llms.blogOtevřít zdroj
Rozšíření sqlite-vec napsal Alex Garcia v čistém přenositelném jazyce C bez externích závislostí jako náhradu za sqlite-vss vyžadující knihovnu Faiss v C++.
Created by Alex Garcia to replace the C++ Faiss-dependent sqlite-vss, sqlite-vec is written entirely in portable C with zero third-party dependencies. It integrates into SQLite through the virtual table mechanism.
llms.blogOtevřít zdroj
Framework sqlite-loadable-rs umožňuje registrovat skalární funkce pomocí define_scalar_function i vytvářet virtuální tabulky přes define_virtual_table.
define_virtual_table() can define a new read-only virtual table module for the given SQLite connection. define_virtual_table_writeable() is also available for tables that support INSERT/UPDATE/DELETE
docs.rsOtevřít zdroj
Rozšíření hello world postavené na sqlite-loadable-rs je zhruba o 10 až 15 procent pomalejší než varianta v C, avšak 20krát až 30krát rychlejší než v jazyce Go.
in general, a “hello world” extension built with sqlite-loadable-rs is about 10-15% slower than one built in C, and several orders of magnitude faster than extensions written in Go with riyaz-ali/sqlite (20-30x faster).
docs.rsOtevřít zdroj
Rozšíření sqlite-vec podporuje jednobitovou binární kvantizaci, která zmenšuje velikost vektorů 32krát a umožňuje výpočet vzdáleností hardwarovými operacemi XOR a popcount.
sqlite-vec supports packed 1-bit boolean vectors. When paired with binary-quantized embedding models like mxbai-embed-large-v1 or nomic-embed-text-v1.5, vector sizes drop by 32x, and distance calculations reduce to hardware-accelerated XOR and popcount CPU operations.
llms.blogOtevřít zdroj
Dynamicky načítaná SQLite rozšíření jsou kompilované dynamické knihovny s příponami .dylib, .so nebo .dll načítatelné v různých prostředích včetně Pythonu, Node.js či CLI.
Notice the word loadable. Loadable extensions are these compiled dynamically-linked libraries, with a suffix of .dylib or .so or .dll (depending on your operating system).
docs.rsOtevřít zdroj
Spouštění vektorového vyhledávání přímo v procesu aplikace eliminuje síťovou latenci mezi datacentry, která se běžně pohybuje mezi 15 a 50 milisekundami.
Running vector search directly inside the application process eliminates network round-trip overhead (typically 15-50ms over cross-datacenter or cloud VPC hops), removes dedicated database infrastructure management, and slashes hosting bills
llms.blogOtevřít zdroj
Vektorové vyhledávání v sqlite-vec lze díky integraci přímo v SQLite propojovat s relačními tabulkami v rámci standardních ACID transakcí.
Because it lives directly within SQLite, vector searches can be natively joined against standard relational tables within standard ACID transactions.
llms.blogOtevřít zdroj
Pro desktopové agenty jako AnythingLLM či Cursor a pro nástroje na příkazové řádce představují vestavěné in-process vektorové databáze často jedinou schůdnou architekturu.
For edge AI applications, CLI developer tools, desktop agents (such as AnythingLLM and Cursor), and serverless execution environments (like AWS Lambda and Cloudflare Workers), embedded vector engines are often the only viable architecture.
llms.blogOtevřít zdroj
Knihovna sqlite-loadable-rs silně spoléhá na nativní C API SQLite, což si v implementaci v Rustu vyžaduje použití unsafe bloků.
sqlite-loadable-rs uses the SQLite C API heavily, which means unsafe code. I try my best to make it as safe as possible, and it’s good that SQLite itself is one of the most well-tested C codebases in the world
docs.rsOtevřít zdroj