Zstd: Zstd-Wörterbuchkomprimierung in einer Streaming-Plattform

Erstellt am 10. Juni 2019  ·  3Kommentare  ·  Quelle: facebook/zstd

Hi,

Ich schreibe hier, weil mir nicht bekannt ist, wo die Frage sonst behandelt werden könnte und vielleicht ist dies eine Einschränkung von Zstd. Ich arbeite an einer Wörterbuchkomprimierung mit Zstd in Pulsar, die auf Netty und dem basiert
io.netty.buffer.ByteBuf-Datentyp.

Das Problem ist folgendes. Beim lokalen Erstellen des Codes kann ich auf direkte Puffer der Eingabe zugreifen und die Wörterbuchgröße beträgt > 10000 Byte. Im Netzwerk, wo ich Eingaben simuliere und es keinen direkten Puffer gibt, der die Wörterbücher unterstützt, wird die Wörterbuchgröße bis zu 500 Byte groß.
Könnte mir jemand helfen, zu erklären, wo die Einschränkungen liegen oder was ich falsch mache.

(die Codebeispiele sind unten).

Lokal:
öffentliches statisches Byte[] getZstdDictionaryAsBytesFromList(ListMitteilungen) {
int inputSize = messages.stream().mapToInt(b -> b.readableBytes()).sum();
ZstdDictTrainer-Trainer = neuer ZstdDictTrainer(inputSize, DICTIONARY_SIZE);
byte[] byteDictionary = null;

    for(ByteBuf buf: messages) {
        trainer.addSample(buf.array());
    }
    byteDictionary = trainer.trainSamples( true);
    return byteDictionary;
}

Netzwerk:
privat CompletableFutureMitteilungen) {
final CompletableFuture int inputSize = messages.stream().mapToInt(b -> b.readableBytes()).sum();
this.dictionaryService.getDictionaryWorkerPool().submit(() -> {
ZstdDictTrainer-Trainer = neuer ZstdDictTrainer(inputSize, 16*1024);
for(ByteBuf msg: this.messageBuffer) {
byte[] msgArray;
if(msg.hasArray()) {
msgArray = msg.array();
} anders {
int howMany = msg.readableBytes();
msgArray = neues Byte[wieviele];
int readerIndex = msg.readerIndex();
msg.getBytes(readerIndex, msgArray);
}
trainer.addSample(msgArray);
}
byte[] byteDictionary = trainer.trainSamples( true);

Es tut mir wirklich leid, wenn ich ein Forum für spezifischere Probleme überflute.
Danke vielmals,
Milena

question

Alle 3 Kommentare

Hallo Milena,

Es sieht so aus, als ob Sie die hier gepflegte zstd-jni-Bindung verwenden? Meine Fähigkeit, Fragen im Zusammenhang mit Java oder der ZSTD-Bindung in dieser Sprache zu beantworten, wird leider sehr eingeschränkt sein. Ich werde aber mein Bestes geben!

Können Sie mir mehr darüber sagen, was Sie mit "im Netzwerk simuliere ich Eingaben" meinen? Das Ziel des Wörterbuchtrainers besteht darin, die sich wiederholenden Teilzeichenfolgen in Ihren Beispieleingaben zu kompilieren und sie in das zurückgegebene Wörterbuch (zusammen mit einem strukturierten Header) zusammenzusetzen. Wenn Sie unkorrelierte synthetische Samples generieren (z. B. indem Sie sie aus einem Zufallszahlengenerator erstellen oder aus /dev/urandom lesen), werden wahrscheinlich keine Byte-Läufe von mehreren Eingaben geteilt, und daher wird das zurückgegebene Wörterbuch leer sein, nur der Header vorhanden (einige hundert Byte).

Es gibt noch ein paar andere Möglichkeiten, die erklären könnten, was Sie erleben, aber das passt am besten zu mir, also möchte ich das zuerst eliminieren.

Hallo Felix,

vielen dank für deine antwort. Mir ist jetzt klar, dass ich hier möglicherweise im falschen Forum bin, da die Frage ziemlich Java-spezifisch zu sein scheint. Die Eingabe, die ich simuliere, ist nicht zufällig, aber ich lese Zeilen aus derselben CSV-Datei. Die Zeilen haben Ähnlichkeiten und sind daher ein gutes Ziel für die Wörterbuchkomprimierung.
Wenn ich dieselben Zeilen (Trainingsdaten) von meinem lokalen Computer lese, habe ich:
Auf lokalem Computer: Größe der Trainingsdaten (Byte): 259475, Wörterbuchgröße (Byte): 16384
Im Netzwerk: Größe der Trainingsdaten (Byte): 62290, Wörterbuchgröße (Byte): 449
Das Problem tritt immer häufiger auf, das nicht mit Zstd zu tun hat, sondern mit Daten, die durch die Konvertierung verloren gehen.

Grüße,
Milena

Ok, basierend auf dem Verdacht, dass das von Ihnen aufgetretene Problem nichts mit zstd selbst zu tun hat, werde ich dieses Problem für den Moment schließen. Wenn Sie jedoch feststellen, dass Sie dem Trainer tatsächlich dieselben Daten präsentieren und unterschiedliche Ergebnisse erzielen, öffnen Sie bitte erneut.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen