2014-09-09 21 views
7

sto usando LZ4 biblioteca e durante la decompressione dei dati conbiblioteca LZ4 decompresso dati limite superiore dimensioni stima

int LZ4_decompress_safe (const char* source, char* dest, int compressedSize, int maxDecompressedSize); 

voglio stimare dimensione massima dei dati decompressi. Ma non riesco a trovare la funzione inversa del

int LZ4_compressBound(int isize); 

con la quale è possibile determinare il limite superiore per i dati decompressi, che per fornire al ultimo parametro maxDecompressedSize, della funzione decompressione.

Altre librerie di compressione come snappy, ad esempio, forniscono tale funzione.

bool GetUncompressedLength(Source* source, uint32* result); 

Cosa posso fare se non ho la capacità di salvare le dimensioni dei dati iniziali (prima della compressione), e se io non voglio essere troppo pessimista per la dimensione del buffer che devo ripartire?

risposta

6

Il rapporto di compressione massimo di LZ4 è 255, quindi una sovrastima garantita delle dimensioni dei dati decompressi è di 255 volte la dimensione dell'input.

Ovviamente è troppo per essere davvero utile, da qui il motivo per cui non è disponibile la funzione "LZ4_compressBound() inversa".

Temo che non ci sia altro modo se non quello di salvare o conoscere la dimensione non compressa. Il formato di compressione "raw" LZ4 non definisce un modo per salvare tali informazioni, poiché la scelta ottimale è specifica dell'applicazione. Ad esempio, alcune applicazioni sanno in anticipo che nessun blocco può essere> 16 KB, quindi possono utilizzare maxDecompressedSize = 16 KB quando si chiama LZ4_decompress_safe().

Ora, se stai cercando un formato di busta che si assumerà tale responsabilità, potresti crearne uno personalizzato oppure utilizzare il formato LZ4 Framing: http://fastcompression.blogspot.fr/2013/04/lz4-streaming-format-final.html (presente anche come LZ4_Framing_Format.html nel pacchetto sorgente) . Ahimè, la libreria in grado di generare e leggere questo formato è attualmente in fase beta (https://github.com/Cyan4973/lz4/tree/frame)

6

Solo per riferimento, n byte di LZ4 dati compressi possono rappresentare fino al 24 + 255 (n-10) non compressi byte, che è il caso di una corsa di quel numero di byte. n deve essere almeno dieci per creare uno stream valido che include un valore letterale, una corrispondenza e cinque valori letterali alla fine secondo la specifica. Quindi la funzione di decompressione legata potrebbe essere qualcosa come (n << 8) - n - 2526.

Il rapporto di compressione massimo è quindi: 255 - 2526/n, che si avvicina asintoticamente 255 per arbitrariamente grande n.

+0

Non ho mai avuto il tempo di calcolare i limiti precisi come chiaramente in questo post. Grazie per le semplici formule! – Cyan