Zstd: Compression du dictionnaire Zstd dans une plateforme de streaming

Créé le 10 juin 2019  ·  3Commentaires  ·  Source: facebook/zstd

Salut,

J'écris ici, car je ne sais pas où la question pourrait être traitée et c'est peut-être une limitation de Zstd. Je travaille sur une compression de dictionnaire avec Zstd dans Pulsar basée sur Netty et le
Type de données io.netty.buffer.ByteBuf.

Le problème est le suivant. Lors de la construction du code localement, je peux accéder aux tampons directs de l'entrée et la taille du dictionnaire est > 10000 octets. Sur le réseau, où je simule l'entrée et où il n'y a pas de tampon direct pour les dictionnaires, la taille du dictionnaire atteint 500 octets.
Quelqu'un pourrait-il m'aider à expliquer où sont les limites ou peut-être ce que je fais mal.

(les exemples de code sont ci-dessous).

Local:
octet statique public[] getZstdDictionaryAsBytesFromList(Listmessages) {
int inputSize = messages.stream().mapToInt(b -> b.readableBytes()).sum();
Formateur ZstdDictTrainer = new ZstdDictTrainer(inputSize, DICTIONARY_SIZE);
byte[] byteDictionary = null;

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

Réseau:
privé CompletableFuturemessages) {
final AchevableFutur int inputSize = messages.stream().mapToInt(b -> b.readableBytes()).sum();
this.dictionaryService.getDictionaryWorkerPool().submit(() -> {
Formateur ZstdDictTrainer = nouveau ZstdDictTrainer(inputSize, 16*1024) ;
for(ByteBuf msg : this.messageBuffer) {
octet[] msgArray;
if(msg.hasArray()) {
msgArray = msg.array();
} autre {
int combien = msg.readableBytes();
msgArray = new byte[howMany] ;
int readerIndex = msg.readerIndex();
msg.getBytes(readerIndex, msgArray);
}
trainer.addSample(msgArray);
}
byte[] byteDictionary = trainer.trainSamples( true);

Vraiment désolé si j'inonde un forum pour des problèmes plus spécifiques.
Merci beaucoup,
Milena

question

Tous les 3 commentaires

Salut Milena,

Il semble que vous utilisiez la liaison zstd-jni maintenue ici ? Ma capacité à répondre aux questions liées à Java ou à la liaison zstd dans cette langue va être très limitée, je suis désolé de le dire. Je ferai de mon mieux, cependant !

Pouvez-vous m'en dire plus sur ce que vous entendez par "sur le réseau, je simule l'entrée" ? L'objectif de l'entraîneur de dictionnaire est de compiler les sous-chaînes répétitives dans vos exemples d'entrées et de les assembler dans le dictionnaire qui est renvoyé (avec un en-tête structuré). Si vous générez des échantillons synthétiques non corrélés (par exemple, en les construisant à partir d'un générateur de nombres aléatoires ou en les lisant à partir de /dev/urandom ), il n'y aura probablement pas de séries d'octets partagés par plusieurs entrées, et donc le dictionnaire renvoyé sera être vide, avec juste l'en-tête présent (quelques centaines d'octets).

Il y a quelques autres possibilités qui pourraient expliquer ce que vous vivez, mais c'est ce qui me convient le mieux, alors j'aimerais d'abord éliminer cela.

Salut Félix,

merci beaucoup pour votre réponse. Je me rends compte maintenant que je ne suis peut-être pas sur le bon forum ici, car la question semble être assez spécifique à Java. L'entrée que je simule n'est pas aléatoire mais je lis des lignes du même fichier .csv. Les lignes partagent des similitudes, d'où une bonne cible pour la compression de dictionnaire.
Lorsque je lis les mêmes lignes (données d'entraînement) sur ma machine locale, j'ai :
Sur la machine locale : taille des données d'entraînement (octets) : 259475, taille du dictionnaire (octets) : 16384
Sur le réseau : taille des données d'apprentissage (octets) : 62290, taille du dictionnaire (octets) : 449
Le problème commence à sembler de plus en plus ne pas avoir à voir avec Zstd mais avec des données qui sont perdues par la conversion.

Salutations,
Milena

Ok, sur la base du soupçon que le problème que vous rencontrez n'est pas lié à zstd lui-même, je vais fermer ce problème pour le moment. Si vous constatez cependant que vous présentez réellement les mêmes données au formateur et obtenez des résultats différents, veuillez rouvrir.

Cette page vous a été utile?
0 / 5 - 0 notes