1

私はLZ4ライブラリを使用しており、データを解凍するとき:

int LZ4_decompress_fast_continue (void* LZ4_streamDecode, const char* source, char* dest, int originalSize);

n最初にエンコードされたNバイトの最初のバイトのみが必要n < Nです。したがって、パフォーマンスを向上させるには、元のバッファーの一部のみを解凍するのが理にかなっています。

関数の引数にn代わりに渡すことができるのだろうか?NoriginalSize

私の最初のテストでは、それは不可能であることが示されました (誤って解凍されたデータを取得しました)。方法はあるかもしれませんが、たとえばnの倍数である場合はCHUNK_SIZE? すべての元のNバイトは、compress 関数の 1 回の呼び出しで圧縮されました。

4

2 に答える 2

4

LZ4_decompress_safe_continue()LZ4_decompress_fast_continue()フルブロックのみをデコードできます。部分的なブロックをエラーと見なし、そのように報告します。また、ブロック全体を解凍するのに十分なスペースがない場合もエラーであると考えています。

お探しの機能はまだ存在しません。しかし、助けになるかもしれない親しいいとこがいます。

LZ4_decompress_safe_partial()ブロックの一部をデコードできます。_continue()バリアントとは対照的に、独立したブロックでのみ機能することに注意してください。圧縮されたブロックは完全である必要があり、出力バッファにはブロック全体をデコードするのに十分なスペースが必要です。したがって、この関数によって提供される唯一の利点は速度です。最初の 10 バイトだけが必要な場合は、十分なバイトが生成されるとすぐに停止します。

「ただちに」は「ちょうど 10 時」という意味ではありません。それはずっと後になる可能性があり、最悪の場合、ブロック全体をデコードした後になる可能性があります。これは、内部のデコード エンジンがまだ同じであるためです。速度を考慮して、シーケンス全体をデコードし、途中で「それらを壊す」ことはありません。

メモリを節約するために、完全なブロックよりも少ないバイト数を抽出する必要がある場合、残念ながら解決策はまだありません。機能リクエストとしてアップストリームに報告してください。

于 2015-11-26T23:14:47.830 に答える