4

一部のデータを圧縮したかったので、デフレートでストリームを実行すると思いました

304 バイトから 578 バイトになりました。これは 1.9 倍です。私はそれを圧縮しようとしていました.....ここで何が間違っていますか?

using (MemoryStream ms2 = new MemoryStream())
using (var ms = new DeflateStream(ms2, CompressionMode.Compress, true))
{
    ms.WriteByte(1);
    ms.WriteShort((short)txtbuf.Length);
    ms.Write(txtbuf, 0, txtbuf.Length);
    ms.WriteShort((short)buf2.Length);
    ms.Write(buf2, 0, buf2.Length);
    ms.WriteShort((short)buf3.Length);
    ms.Write(buf3, 0, buf3.Length);
    ms.Flush();
    result_buf = ms2.ToArray();
}
4

6 に答える 6

4

データがどの程度拡大しているかは、DeflateStream クラスのバグです。バグは GZipStream クラスにも存在します。ここでこの問題の説明を参照してください:私の C# gzip は、Fiddler や PHP よりも大きなファイルを生成するのはなぜですか? .

Microsoft が提供する DeflateStream クラスは使用しないでください。代わりに、置換クラスを提供するDotNetZipを使用してください。

圧縮できないデータは、圧縮しようとするとわずかに膨張しますが、その量はわずかです。適切に作成された deflate 圧縮プログラムによる最大の拡張は、5 バイトにわずかな割合を加えたものです。 zlibの非圧縮データの展開 (raw deflate のデフォルト設定を使用) は、5 バイト + 入力サイズの 0.03% です。圧縮できない場合、304 バイトは、DeflateStream などの raw deflate 圧縮プログラムから 309 バイトとして出力されるはずです。5 バイトまたは 6 バイトを超える長さでの 1.9 倍の拡張はバグです。

于 2012-07-14T15:29:19.567 に答える
3

圧縮しようとしているデータが実際には圧縮できない可能性があります (または、最初から圧縮するデータがあまりありません)。圧縮は、データに繰り返しがある場合に最適に機能します。

圧縮スキームがストリームの復号化に使用されるメタデータを追加しているため、おそらく大きくなりますが、データが圧縮できないか、圧縮を有効にするためのデータがあまりないため、実際には悪化しています.

zip ファイルを zip するなどの操作を行った場合、解凍によって常にサイズが小さくなるとは限らないことがわかります。

于 2012-07-14T05:58:30.250 に答える
3

圧縮アルゴリズムは、出力に追加されるコード テーブルを使用するか、処理するのに十分な量を見つけるために大きなサンプルを必要とするため、データの小さなブロックが大きくなることがよくあります。

あなたは何も悪いことをしていません。

于 2012-07-14T05:59:18.957 に答える
2

そうじゃないかな

using (var ms = new DeflateStream(ms2, CompressionMode.Compress, true))

それ以外の

using (var ms = new DeflateStream(ms, CompressionMode.Compress, true))

MemoryStream を DeflateStream で装飾したい場合は、このようにする必要があります。

于 2012-07-14T05:58:34.103 に答える
0

コメントで自分の質問に答えました:

何を変更したかはわかりませんが、データは実行ごとにランダムに作成されます

ランダム データは圧縮が困難です。一般に、データに多くのパターンが含まれている場合 (辞書や Web サイトのテキストなど)、適切に圧縮されます。しかし、圧縮アルゴリズムの最悪のケースは、ランダム データに直面した場合です。真にランダムなデータにはパターンがありません。それでは、圧縮アルゴリズムはどのようにしてそれを圧縮できると期待できますか?

次に考慮すべきことは、特定の圧縮アルゴリズムがデータを格納する方法にオーバーヘッドがあるという事実です。通常、いくつかのヘッダー ビットの後にいくつかのシンボル データが続きます。ランダム データの場合、データを他の形式に圧縮することはほとんど不可能であり、データ間に大量のヘッダー ビットが散在することになり、「次のデータはそのように表現されている」という以外の目的はありません。

圧縮形式に応じて、合計ファイル サイズのパーセンテージとしてのオーバーヘッドは、比較的小さい場合と大きい場合があります。どちらの場合でも、新しいファイルを古いファイルよりも大きくするオーバーヘッドが発生します

于 2012-07-14T15:37:18.377 に答える