Zstd: Compressão de dicionário Zstd em uma plataforma de streaming

Criado em 10 jun. 2019  ·  3Comentários  ·  Fonte: facebook/zstd

Oi,

Estou escrevendo aqui, porque não sei onde mais a questão poderia ser tratada e talvez esta seja uma limitação do Zstd. Estou trabalhando em uma compactação de dicionário com Zstd no Pulsar que se baseia no Netty e no
tipo de dados io.netty.buffer.ByteBuf.

O problema é o seguinte. Ao construir o código localmente, posso acessar buffers diretos da entrada e o tamanho do dicionário é> 10.000 bytes. Na rede, onde simulo a entrada e não há buffer direto apoiando os dicionários, o tamanho do dicionário chega a 500 bytes.
Alguém poderia me ajudar explicando onde estão as limitações ou talvez o que eu fiz de errado.

(os exemplos de código estão abaixo).

Local:
public static byte [] getZstdDictionaryAsBytesFromList (Listmensagens) {
int inputSize = messages.stream (). mapToInt (b -> b.readableBytes ()). sum ();
Treinador ZstdDictTrainer = novo ZstdDictTrainer (inputSize, DICTIONARY_SIZE);
byte [] byteDictionary = null;

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

Rede:
private CompletableFuturemensagens) {
final CompletableFuture int inputSize = messages.stream (). mapToInt (b -> b.readableBytes ()). sum ();
this.dictionaryService.getDictionaryWorkerPool (). submit (() -> {
Treinador ZstdDictTrainer = novo ZstdDictTrainer (inputSize, 16 * 1024);
para (ByteBuf msg: this.messageBuffer) {
byte [] msgArray;
if (msg.hasArray ()) {
msgArray = msg.array ();
} outro {
int howMany = msg.readableBytes ();
msgArray = novo byte [howMany];
int readerIndex = msg.readerIndex ();
msg.getBytes (readerIndex, msgArray);
}
trainer.addSample (msgArray);
}
byte [] byteDictionary = trainer.trainSamples (true);

Realmente sinto muito se estou inundando um fórum para questões mais específicas.
Muito obrigado,
Milena

question

Todos 3 comentários

Oi milena,

Parece que você está usando a ligação zstd-jni mantida aqui ? Minha capacidade de responder a perguntas relacionadas ao java ou zstd vinculativo nessa linguagem vai ser muito limitada, lamento dizer. Vou fazer o meu melhor, no entanto!

Você pode me dizer mais sobre o que entende por "na rede, eu simulo a entrada"? O objetivo do treinador de dicionário é compilar as substrings que ocorrem repetidamente em suas entradas de amostra e montá-las no dicionário que é retornado (junto com um cabeçalho estruturado). Se você estiver gerando amostras sintéticas não correlacionadas (por exemplo, construindo-as a partir de um gerador de números aleatórios ou lendo-as de /dev/urandom ), provavelmente não haverá execuções de bytes compartilhados por várias entradas e, portanto, o dicionário retornado estar vazio, com apenas o cabeçalho presente (algumas centenas de bytes).

Existem algumas outras possibilidades que podem explicar o que você está experimentando, mas é o que se encaixa melhor em minha mente, então eu gostaria de eliminá-la primeiro.

Oi felix,

muito obrigado pela sua resposta. Agora percebo que posso estar no fórum errado aqui, pois a questão parece ser bem específica do Java. A entrada que estou simulando não é aleatória, mas estou lendo linhas do mesmo arquivo .csv. As linhas compartilham semelhanças, portanto, um bom alvo para compactação de dicionário.
Quando leio as mesmas linhas (dados de treinamento) em minha máquina local, tenho:
Na máquina local: tamanho dos dados de treinamento (bytes): 259475, tamanho do dicionário (bytes): 16384
Na rede: tamanho dos dados de treinamento (bytes): 62290, tamanho do dicionário (bytes): 449
O problema começa a parecer cada vez mais não ter a ver com o Zstd, mas com os dados que se perdem na conversão.

Cumprimentos,
Milena

Ok, com base na suspeita de que o problema que você está enfrentando não está relacionado ao zstd em si, encerrarei esse problema por enquanto. No entanto, se você descobrir que realmente está apresentando os mesmos dados ao treinador e obtendo resultados diferentes, abra novamente.

Esta página foi útil?
0 / 5 - 0 avaliações