通过压缩和存储在对象中减少字符串大小

时间:2011-04-24 05:50:26

标签: c#

我们的工作应用程序基本上每晚需要创建超过一百万个物体,以进行数值模拟,包括白天记录的一些天气观测。

每个对象都包含一些字符串属性(以及一个非常大的xml属性 - 大约2 MB) - 由于我们没有加载它而需要大型xml属性的大小,而是在我们需要访问这个时更喜欢去数据库xml blob(我们为每个对象做的)

我想知道以某种方式检索xml数据(2MB)在内存中压缩它并将其存储在对象中是否有意义 - 这可以防止我们在处理它时对每个对象进行数据库查询

我更愿意压缩数据,将其存储在对象中,并在处理时,解压缩和处理

是否可以在进程中压缩字符串,如何在不为每个对象创建数百万个MemoryStreams / zip流的情况下执行此操作?

2 个答案:

答案 0 :(得分:1)

我认为压缩不是一个好主意 - 它会给处理带来相当大的开销,而这似乎已经非常密集了。

也许轻量级格式会更好 - JSON或表示数据的二进制序列化对象。

如果没有更多细节,很难给出明确答案或更好的选择。

答案 1 :(得分:1)

嗯,DotNetZip有一个简单的API,所以你可以这样做:

byte[] compressedProperty;
public string MyProperty
{
    get { DeflateStream.UncompressString(compressedProperty); }
    set { compressedProperty = DeflateStream.CompressString(value); }
}

不确定它是否能在你的表现方面表现出色。

<强>更新: 我只知道GZipStreamDeflateStream类。它们都没有公开string接口。当你调用上面的函数时,甚至DotNetZip都会使用一个流,它只是围绕一个漂亮的界面(你可以自己使用System.IO.Compression类)。不知道你的问题是什么。  如果你真的想避免使用流,那么你可能需要自己进行压缩。 Here is a guy使用简单的霍夫曼编码器对F#中的字符串进行编码。不知道它有多好用,但我想避免使用第三方库和流,那么你可以给它一个破解。