3

次のコードを使用して、VB.Net でファイルの圧縮を開始しました。Fx 2.0 をターゲットにしているため、このStream.CopyToメソッドは使用できません。

Normalただし、私のコードは、7-zipの gzip 圧縮プロファイルと比較して非常に悪い結果をもたらします。たとえば、私のコードは 630MB の Outlook アーカイブを 740MB に圧縮し、7-zip はそれを 490MB にします。

これがコードです。あからさまな間違いがありますか (または多くありますか?)

Using Input As New IO.FileStream(SourceFile, IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.Read)
    Using outFile As IO.FileStream = IO.File.Create(DestFile)
        Using Compress As IO.Compression.GZipStream = New IO.Compression.GZipStream(outFile, IO.Compression.CompressionMode.Compress)
            'TODO: Figure out the right buffer size.'
            Dim Buffer(524228) As Byte
            Dim ReadBytes As Integer = 0

            While True
                ReadBytes = Input.Read(Buffer, 0, Buffer.Length)
                If ReadBytes <= 0 Then Exit While
                Compress.Write(Buffer, 0, ReadBytes)
            End While
        End Using
    End Using
End Using

複数のバッファ サイズを試してみましたが、同様の圧縮時間とまったく同じ圧縮率が得られます。

4

3 に答える 3

5

編集、または実際に書き直します: BCLコーダーがで電話をかけることにしたようです。

System.dllバージョン2.0の実装では、他の実装のようにハフマンツリーを適応的に生成するのではなく、プレーンASCIIテキスト用に最適化された静的に定義されたハードコードされたハフマンツリーを使用します。また、保存ブロックの最適化もサポートしていません(これは、標準のGZip / Deflateが暴走拡張を回避する方法です)。その結果、プレーンテキスト以外の実装であらゆる種類のファイルを実行すると、入力よりもはるかに大きなファイルになります。Microsoftは、これは仕様によるものであると主張しています。

少しの苦痛を省き、サードパーティの実装を入手してください。

于 2011-02-12T00:00:59.843 に答える
1

IO.Compressionは実際には作成されていません。XPSまたはXMLPaperSpecificatinをサポートするために作成されました。適切なファイル圧縮が必要な場合は、現在、サードパーティのライブラリを使用する必要があります。

于 2011-02-11T23:56:26.700 に答える
0

役に立つかもしれないいくつかの追加情報。プロジェクト リリースに含めるためにいくつかの静的ファイル (バイナリ) を圧縮していましたが、IO.Compression.GZipStream でファイル サイズが増加するという同じ問題がありました。

最適な圧縮を使用できる場合は、代わりに Ionic.Zip を使用することにしました。

すぐに気づいたことの 1 つは、Ionic.Zip によってファイルが元のサイズの 25% に縮小されたにもかかわらず、圧縮アクションが約 3 ~ 4 倍遅くなった (完全に予想された) ことですが、解凍プロセスも 3 倍遅く、解凍に時間がかかりました。 0.5秒から1.6秒。

GZipStream は標準であるため、.NET に組み込まれている IO.Compression.GZipStream は圧縮効率がはるかに低くても、解凍ははるかに高速でした。

そのため、 Ionic.Zip ライブラリ " ZLib.GZipStream " を使用してファイルを圧縮し、" IO.Compression.GZipStream "を使用してファイルを本番環境でより高速に解凍します。

于 2013-04-14T00:21:43.413 に答える