c ++ - Random Access File Format til hierarkisk organiserede binære og tekstfiler

Indlæg af Hanne Mølgaard Plasc

Problem



En Windows desktop applikation, hvis udviklings team jeg er en del af bruger den arven MFC CArchive som dens applikationsfilformat til serialisering af både tekstfiler og binære filer til og fra disk. Appen bruges til at lokalisere strenge indeholdt i disse tekst/binære filer , og CArchive indkapsler et oversættelsesprojekt, så det genereres som en monolitisk fil, der indeholder en eller flere af disse underfiler.


Dette filformat viser sin alder på mange måder, og vi søger at skifte til noget mere moderne. Vores største bekymringer er, at det er langsomt og optager enorme mængder hukommelse; det er ikke tilfældig adgang, så adgang til en vilkårlig fil i arkivet eller endda bare at generere en katalogfortegnelse kræver, at hele ting hentes i hukommelsen, så rum- og tidsforbruget til at manipulere arkivet er afhængigt af dets størrelse, og det er s Det er heller ikke muligt at gøre in-place opdateringer af arkivet heller.


Endelig er udvidelsen af ​​formatet smertefuldt, da det indebærer, at vi kaster vores kode med betingede udsagn, der serialiserer bestemte felter (eller ej) til eller fra arkivet afhængigt af værdien af ​​arkivets versionsstempel.


Jeg har brugt lidt tid på at kigge på alternativerne, og dem der skiller sig ud er ZIP/7Z eller SQLite, da ZIP allerede har størstedelen af ​​filhåndtering/indekseringsfunktionalitet indbygget, mens SQLite ville være ideel til lagring, hentning og søgning af strenge, så jeg tænker på, at en kombination af de to teknologier kan være vejen at gå.


Så vidt jeg kan se, ville tricket organisere eller opdele SQLite DB på en sådan måde, at det som det vokser, går det ikke langsomt, og søgninger kan begrænses til individuelle filer, enten ved at oprette en tabel pr. Fil eller en DB per fil, jeg er ikke sikker.


Har nogen andre prøvet sådan noget, og i så fald nogen råd?


Tak

Bedste reference


Som en filbaseret database kan SQLite bruges til at implementere et applikationsfilformat. [3]


Hvis alt du vil gøre er at gemme indlejrede filer, kan du sætte en flok klumper i et bord (se sqlar til et eksempel). Men hvis du vil modellere den interne struktur af disse filer, kan du selvfølgelig have mere komplekse tabeller. [4]


For at begrænse søgninger til filer, skal du bare gemme noget for at identificere filen:




CREATE TABLE Strings (
    StringID  INTEGER PRIMARY KEY,
    FileID    REFERENCES FileTable(FileID),
    Value     TEXT,
    [...]
);


så du kan begrænse dine forespørgsler:


SELECT * FROM Strings WHERE Value = 'hello' AND FileID = 42;


Hvis du ikke vil søge efter hele strenge, men ord inde i dem, skal du overveje at bruge fuldtekstsøgningsudvidelsen. [5]