Gli schemi di compressione basati su LZ si basano sul trovare ed eliminare stringhe di caratteri ripetute. Mentre comprimono un flusso, creano un dizionario di stringhe che sono state incontrate, così quando viene ritrovata la stessa stringa, trasmettono la posizione di quella stringa nel dizionario invece di ritrasmettere l'intera stringa.
In un caso tipico, i primi kilobyte di dati in realtà si espandono un po ', perché il dizionario inizia (essenzialmente 1 ) vuoto. Solo dopo che alcuni kilobyte sono stati scansionati e le stringhe sono state aggiunte al dizionario, inizierai a ottenere molta compressione.
Per fare in modo che un tale algoritmo funzioni in modo decente su dati orientati alla registrazione, probabilmente si desidera raggruppare i record in blocchi di, ad esempio, qualcosa come 64K ciascuno. La lettura di un record sarà una procedura in due fasi. Per prima cosa troverai il blocco che contiene il record, lo leggi in memoria e decomprime l'intero blocco. Quindi troverai il record che ti interessa in quei dati decompressi.
La dimensione del blocco selezionata è un compromesso tra efficienza di compressione ed efficienza di accesso casuale. Un blocco più grande generalmente migliora la compressione, ma (ovviamente abbastanza) richiede di leggere più dati per ottenere i record in un blocco. Una dimensione di blocco più piccola riduce i dati aggiuntivi che è necessario leggere per ottenere un determinato record, ma riduce anche la compressione.
Se sei disposto a eseguire manualmente la compressione, puoi fare le cose in modo diverso. L'idea generale sarebbe quella di scansionare una grande quantità di dati per costruire un dizionario (approssimativamente simile a LZ) di stringhe ripetute, ma non fare la compressione al volo come fa LZ. Invece, memorizzare il dizionario (separatamente dai dati). Dopo aver analizzato tutti i dati, utilizzare il dizionario completo per comprimere i dati. Ciò richiede di memorizzare il dizionario (che utilizza un po 'di spazio) ma consente di averlo pre-compilato quando si decomprimono i dati. Questo riduce la penalità per la compressione di ogni record separatamente, quindi quando leggi i dati dovrai solo leggere un record (più le parti associate del dizionario - ma quando è in uso, probabilmente avrai la maggior parte del dizionario nella RAM la maggior parte del tempo).
1 In alcune implementazioni, il dizionario inizia inizializzato con le voci per i 256 valori di byte possibili, ma questo risulta ancora in espansione - ognuna di quelle stringhe di un carattere è rappresentata nel bit-stream con un codice (minimo di) a 9 bit. In altri casi, quelle voci del dizionario sono "virtuali" - ciascuna viene considerata presente nella posizione corretta nel dizionario, ma mai effettivamente memorizzata.