Zstd: ストリーミングプラットフォームでのZstd辞書圧縮

作成日 2019年06月10日  ·  3コメント  ·  ソース: facebook/zstd

やあ、

私はここに書いています。なぜなら、他にどこで質問を処理できるかわからないからです。おそらくこれはZstdの制限です。 Nettyとに基づくPulsarのZstdを使用した辞書圧縮に取り組んでいます。
io.netty.buffer.ByteBufデータ型。

問題は次のとおりです。 コードをローカルでビルドする場合、入力の直接バッファーにアクセスでき、辞書のサイズは> 10000バイトです。 入力をシミュレートし、辞書をバックアップする直接バッファーがないネットワークでは、辞書のサイズは500バイトにもなります。
誰かが制限がどこにあるのか、あるいは私が間違っていることを説明するのを手伝ってくれませんか?

(コード例は以下のとおりです)。

ローカル:
public static byte [] getZstdDictionaryAsBytesFromList(Listメッセージ){
int inputSize = messages.stream()。mapToInt(b-> b。読み取り可能バイト())。sum();
ZstdDictTrainer trainer = new ZstdDictTrainer(inputSize、DICTIONARY_SIZE);
byte [] byteDictionary = null;

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

通信網:
プライベートCompletableFutureメッセージ){
最終的なCompletableFuture int inputSize = messages.stream()。mapToInt(b-> b。読み取り可能バイト())。sum();
this.dictionaryService.getDictionaryWorkerPool()。submit(()-> {
ZstdDictTrainer trainer = new ZstdDictTrainer(inputSize、16 * 1024);
for(ByteBuf msg:this.messageBuffer){
byte [] msgArray;
if(msg.hasArray()){
msgArray = msg.array();
} そうしないと {
int howMany = msg.writtenBytes();
msgArray = new byte [howMany];
int readerIndex = msg.readerIndex();
msg.getBytes(readerIndex、msgArray);
}
trainer.addSample(msgArray);
}
byte [] byteDictionary = trainer.trainSamples(true);

より具体的な問題についてフォーラムに殺到している場合は、本当に申し訳ありません。
どうもありがとう、
ミレーナ

question

全てのコメント3件

こんにちはミレーナ、

ここで管理さ

「ネットワーク上で、入力をシミュレートする」とはどういう意味か、詳しく教えてください。 ディクショナリトレーナーの目標は、サンプル入力で繰り返し発生するサブストリングをコンパイルし、それらを(構造化されたヘッダーとともに)返されるディクショナリにアセンブルすることです。 相関のない合成サンプルを生成している場合(たとえば、乱数ジェネレーターからサンプルを作成したり、 /dev/urandomから読み取ったりする場合)、複数の入力で共有されるバイトの実行がない可能性が高いため、返される辞書は空で、ヘッダーのみが存在します(数百バイト)。

あなたが経験していることを説明できる他のいくつかの可能性がありますが、それが私の心に最もよく合うものなので、最初にそれを排除したいと思います。

こんにちはフェリックス、

お返事ありがとうございます。 質問はJava固有のように思われるため、ここで間違ったフォーラムに参加している可能性があることに気付きました。 シミュレートしている入力はランダムではありませんが、同じ.csvファイルから行を読み取っています。 これらの行は類似点を共有しているため、辞書圧縮の適切なターゲットになります。
ローカルマシンから同じ行(トレーニングデータ)を読み取ると、次のようになります。
ローカルマシンの場合:トレーニングデータのサイズ(バイト):259475、辞書のサイズ(バイト):16384
ネットワーク上:トレーニングデータのサイズ(バイト):62290、辞書のサイズ(バイト):449
問題は、Zstdに関係するのではなく、変換によって失われるデータに関係するようになり始めています。

よろしく、
ミレーナ

さて、あなたが経験している問題はzstd自体とは無関係であるという疑いに基づいて、私は今のところこの問題を閉じるつもりです。 実際に同じデータをトレーナーに提示し、異なる結果が得られていることに気付いた場合は、再度開いてください。

このページは役に立ちましたか?
0 / 5 - 0 評価