0

私は WPF アプリを開発しています。このアプリでは、重い DataSet またはオブジェクト (<2MB) を暗号化および圧縮し、ネットワーク経由で送信します。相手はデータを解凍して復号化し、それを消費します。このプロセスは、サーバー (WCF) からクライアントへ、およびクライアントからサーバーへの両側で行われます。

  1. 効率的な圧縮クラスが必要です (.Net 圧縮クラスに固執したい)。
  2. 圧縮と解凍にかかる時間が短縮されます。
  3. 圧縮率が高く、データの取得は 100% である必要があります。

圧縮クラス (DeflateStream/GzipStream) について教えてください。

ありがとう
VJ

4

1 に答える 1

1

ほとんどの人は、「圧縮された最終サイズ」==「より良いネットワークパフォーマンス」と混同します。一般的に、「デフレートよりも優れた」クラスの圧縮アルゴリズムを使用すると、転送帯域幅を減らすことができますが、合計転送時間(圧縮+転送+解凍)を増やすことができます。その意味で、LZクラスのコンプレッサーが最適のようです。最速の実装はQuickLZまたはLZ4です。どちらもC#バージョンです。ただし、それらの実装は、たとえばDeflateStream(実際には使用が簡単)とまったく同じではありません。QuickLZはネットワーク関連のアプリケーションでの使用が増えていますが、LZ4は最近GoogleのSnappyではなくApacheHadoopソーストランクにパッチを適用しています。

さらに圧縮が必要な場合は、マネージドLZMA圧縮/解凍メソッドで構成されるLZMASDKを入手できます。ただし、警告する必要があります。LZMAのメモリ消費量は通常非常に高くなります(パラメータによって異なります)。したがって、LZMAを利用したスレッドをいくつか生成することは、実際には必要ないでしょう。

さらに圧縮が必要な場合は、PPMまたはビット単位のCMクラスのアルゴリズムを参照してください。PPMはテキストデータに非常に優れており、平均速度(通常は2〜3 MiB /秒)があります。一方、CMはバイナリデータに非常に適しています。それらのメモリ消費量は高く(パラメータに依存します)、非常に遅くなります(1 MiB /秒から数バイト/秒、アルゴリズムに依存します)。残念ながら、インターネット上でのみPPM.NETの実装を見つけることができます。しかし、CMは非常に複雑であるため、.NETで見つけるのは非常に面倒です。.NETでorder0ビット単位のコーダーを作成しました。これは、本当に必要な場合は、追加のモデルを使用して適切なCMに拡張できます。

于 2011-12-24T10:46:20.700 に答える