11 Stimmen

Die LZ4-Bibliothek schätzt die Größe der dekomprimierten Daten nach oben.

Ich verwende die LZ4-Bibliothek und wenn ich Daten mit

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

dekomprimiere, möchte ich die maximale Größe der dekomprimierten Daten schätzen. Aber ich kann keine Umkehrfunktion von

int LZ4_compressBound(int isize);

finden, mit der ich die obere Grenze für die dekomprimierten Daten bestimmen kann, die ich als letzten Parameter maxDecompressedSize an die Dekomprimierungsfunktion übergeben soll.

Andere Kompressionsbibliotheken wie snappy bieten beispielsweise eine solche Funktion.

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

Was kann ich tun, wenn ich nicht in der Lage bin, die ursprüngliche Datengröße (vor der Kompression) zu speichern und wenn ich nicht übermäßig pessimistisch für die Größe des Puffers sein möchte, den ich zuweisen muss?

10voto

Mark Adler Punkte 87756

Nur zur Referenz, n Bytes an LZ4-komprimierten Daten können bis zu 24 + 255(n - 10) unkomprimierte Bytes darstellen, was bei einer so großen Anzahl an Bytes der Fall ist. n muss mindestens zehn sein, um einen gültigen Datenstrom zu erstellen, der ein Literal, einen Treffer und dann fünf Literale am Ende enthält, gemäß der Spezifikation. Daher könnte die Dekompressionsgrenzfunktion so etwas wie (n << 8) - n - 2526 sein.

Das maximale Kompressionsverhältnis beträgt dann: 255 - 2526 / n, das asymptotisch für beliebig große n 255 erreicht.

8voto

Cyan Punkte 12362

Das maximale Kompressionsverhältnis von LZ4 beträgt 255, daher ist eine garantierte Überschätzung der dekomprimierten Datenmenge 255-mal so groß wie die Eingabegröße.

Das ist offensichtlich zu viel, um wirklich nützlich zu sein, daher gibt es keine "umgekehrte LZ4_compressBound()" Funktion.

Ich fürchte, es gibt keinen anderen Weg, als die unkomprimierte Größe zu speichern oder zu kennen. Das LZ4 "rohe" Kompressionsformat definiert keinen Weg, um solche Informationen zu speichern, da die optimale Wahl anwendungsspezifisch ist. Zum Beispiel wissen einige Anwendungen im Voraus, dass kein Block größer als 16 KB sein kann, so dass sie maxDecompressedSize = 16 KB verwenden können, wenn sie LZ4_decompress_safe() aufrufen.

Wenn Sie nach einem Umschlagformat suchen, das diese Verantwortung übernimmt, können Sie entweder Ihr eigenes benutzerdefiniertes Format erstellen oder das LZ4 Framing-Format verwenden: http://fastcompression.blogspot.fr/2013/04/lz4-streaming-format-final.html (auch als LZ4_Framing_Format.html im Quellpaket vorhanden). Leider befindet sich die Bibliothek, die dieses Format generieren und lesen kann, derzeit in der Beta-Phase (https://github.com/Cyan4973/lz4/tree/frame)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X