Add disk-backed SQLite cache mode as an alternative to in-memory
This commit is contained in:
+13
-1
@@ -47,12 +47,23 @@ with engine.connect() as conn:
|
||||
|
||||
## Cache backend
|
||||
|
||||
Dva režimy (volí se `CachingEngine(engine, in_memory=...)` nebo env `SQLMEM_IN_MEMORY`):
|
||||
|
||||
**In-memory (výchozí, `in_memory=True`)**
|
||||
|
||||
- **SQLite in-memory** jako primární úložiště — veškeré dotazy běží v RAM.
|
||||
- **Persistence na disk** (`cache.db`) ve třech situacích:
|
||||
- **Při startu**: pokud soubor existuje, načte se do paměti (`ATTACH` + kopie).
|
||||
- **Periodicky každou hodinu**: snapshot in-memory SQLite se zapíše na disk (backup API).
|
||||
- **Při vypnutí**: finální zápis na disk před ukončením (signal handler + context manager).
|
||||
- Celé tabulky se při cache miss načtou z databáze a drží v paměti.
|
||||
|
||||
**Disk-backed (`in_memory=False`)**
|
||||
|
||||
- Dotazy běží přímo nad on-disk souborem `cache.db` — **žádná kopie v RAM**, cache může přesáhnout dostupnou paměť.
|
||||
- Každý zápis se rovnou ukládá na disk (WAL + `synchronous=NORMAL`); odpadá hodinový backup thread i načítání do paměti při startu.
|
||||
- Při otevření se cache s nesedícím `schema_version` zahodí a postaví znovu; `engine.reset()` smaže tabulky a provede `VACUUM` (soubor neodlinkuje).
|
||||
|
||||
Celé tabulky se při cache miss načtou z databáze (v obou režimech).
|
||||
|
||||
---
|
||||
|
||||
@@ -195,6 +206,7 @@ SQLMEM_DEBUG=true # DEBUG level — podrobný výpis každého dotazu, cache o
|
||||
- [x] **`engine.reset()`**: smaže celou cache (RAM + `cache.db`) pro čistý rebuild po strukturální změně.
|
||||
- [x] **Sekundární indexy**: `indexes={"VW_X": ["col", ["a","b"]]}` — indexy na in-memory cache pro zrychlení `WHERE`/`JOIN`; index-sloupce se auto-dotáhnou, indexy se obnoví po každém (re)loadu.
|
||||
- [x] **TTL na úrovni tabulky**: `ttl={"VW_X": 300}` — pro tabulky bez timestamp sloupce. Garantuje, že cache není starší než interval (full reload při čtení po expiraci + proaktivně na pozadí).
|
||||
- [x] **Disk-backed cache**: `in_memory=False` (nebo `SQLMEM_IN_MEMORY=false`) — dotazy běží přímo nad on-disk `cache.db` (WAL), bez kopie v RAM; cache může přesáhnout paměť, zápisy se rovnou persistují.
|
||||
|
||||
## TODO — budoucí funkce
|
||||
|
||||
|
||||
Reference in New Issue
Block a user