是否可以使用SharpZipLib压缩List<T>
?
将List转换为字节数组可以得到大约60000字节(未压缩)。
使用System.IO.Compression.DeflateStream
进行压缩可以得到大约1/3的压缩率,但这还远远不够。
目的是将集合作为byte[]
存储在(MS SQL)数据库中,因为将它们保存为单独的行会占用大量空间(每天100万行)。
由于
编辑:
List<ItemLog> itemLogs = new List<ItemLog>();
//populate with 1000 ItemLogs
byte[] array = null; //original byte array
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
bf.Serialize(ms, itemLogs);
array = ms.ToArray();
array
大小现在为60000字节
Zip the collection using a ZipOutputStream
MemoryStream outputMemoryStream = new MemoryStream();
ZipOutputStream zipStream = new ZipOutputStream(outputMemoryStream);
zipStream.SetLevel(3);
ZipEntry entry = new ZipEntry("logs");
entry.DateTime = DateTime.Now;
zipStream.PutNextEntry(entry);
StreamUtils.Copy(ms, zipStream, new byte[4096]);
zipStream.CloseEntry();
zipStream.IsStreamOwner = false;
zipStream.Close();
outputMemoryStream.Position = 0;
byte[] compressed = outputMemoryStream.ToArray();
compressed
现在大小为164字节。 &lt; - 长度无效/可能?
解压缩给了我一个空数组。但由于压缩不正确,我现在将跳过解压缩代码。
答案 0 :(得分:1)
我的代码中没有任何实际问题。问题所在的唯一部分是复制数据。数据开头的输入数据流是否应该存储?尝试添加以下行:
ms.Seek(0, SeekOrigin.Begin); // added line
StreamUtils.Copy(ms, zipStream, new byte[4096]);
根据你的代码,我写了一个简单的压缩函数,它按预期工作。
private static byte[] Compress(byte[] source)
{
byte[] compressed;
using (var memory = new MemoryStream())
using (var zipped = new ZipOutputStream(memory))
{
zipped.IsStreamOwner = false;
zipped.SetLevel(9);
var entry = new ZipEntry("data")
{
DateTime = DateTime.Now
};
zipped.PutNextEntry(entry);
#if true
zipped.Write(source, 0, source.Length);
#else
using (var src = new MemoryStream(source))
{
StreamUtils.Copy(src, zipped, new byte[4096]);
}
#endif
zipped.Close();
compressed = memory.ToArray();
}
#if false
using (var file = new FileStream("test.zip", FileMode.Create, FileAccess.Write, FileShare.Read))
{
file.Write(compressed, 0, compressed.Length);
}
#endif
return compressed;
}
您可以选择如何保存输出(数组或流),并且已禁用代码将压缩数据保存到文件(以检入外部应用程序中的实际压缩内容数据)
我测试的数据是256字节长的(数据,压缩率很小),结果是407字节(文件)。
尝试使用数组,或检查保存的流内容。