データベースにブロブとして保存したい大きなオブジェクトがメモリ内にあります。データベースサーバーは通常ローカルではないため、保存する前に圧縮したいと思います。
これは私が現時点で持っているものです:
using (var memoryStream = new MemoryStream())
{
using (var gZipStream = new GZipStream(memoryStream, CompressionMode.Compress))
{
BinaryFormatter binaryFormatter = new BinaryFormatter();
binaryFormatter.Serialize(gZipStream, obj);
return memoryStream.ToArray();
}
}
ただし、Total Commander で同じバイトを圧縮すると、常にサイズが少なくとも 50% 削減されます。上記のコードでは、58MB を 48MB に圧縮し、15MB より小さいものはさらに大きくなります。
サードパーティの zip ライブラリを使用する必要がありますか、または .NET 3.5 でこれを行うためのより良い方法はありますか。私の問題に対する他の選択肢はありますか?
編集:
上記のコードにバグが見つかりました。アンジェロ、修正してくれてありがとう。
GZipStream の圧縮はまだ優れていません。TC の 48% 圧縮と比較して、gZipStream による平均圧縮率は 35% です。
以前のバージョンでどのようなバイトを取得していたのかわかりません:)
EDIT2:
圧縮率を 20% から 47% に改善する方法を見つけました。メモリ ストリームを 1 つではなく 2 つ使用する必要がありました。なぜこれが当てはまるのか、誰でも説明できますか?
これは、はるかに優れた圧縮を行う2つのメモリストリームを持つコードです!!!
using (MemoryStream msCompressed = new MemoryStream())
using (GZipStream gZipStream = new GZipStream(msCompressed, CompressionMode.Compress))
using (MemoryStream msDecompressed = new MemoryStream())
{
new BinaryFormatter().Serialize(msDecompressed, obj);
byte[] byteArray = msDecompressed.ToArray();
gZipStream.Write(byteArray, 0, byteArray.Length);
gZipStream.Close();
return msCompressed.ToArray();
}