我们的工作应用程序基本上每晚需要创建超过一百万个物体,以进行数值模拟,包括白天记录的一些天气观测。
每个对象都包含一些字符串属性(以及一个非常大的xml属性 - 大约2 MB) - 由于我们没有加载它而需要大型xml属性的大小,而是在我们需要访问这个时更喜欢去数据库xml blob(我们为每个对象做的)
我想知道以某种方式检索xml数据(2MB)在内存中压缩它并将其存储在对象中是否有意义 - 这可以防止我们在处理它时对每个对象进行数据库查询
我更愿意压缩数据,将其存储在对象中,并在处理时,解压缩和处理
是否可以在进程中压缩字符串,如何在不为每个对象创建数百万个MemoryStreams / zip流的情况下执行此操作?
答案 0 :(得分:1)
我认为压缩不是一个好主意 - 它会给处理带来相当大的开销,而这似乎已经非常密集了。
也许轻量级格式会更好 - JSON或表示数据的二进制序列化对象。
如果没有更多细节,很难给出明确答案或更好的选择。
答案 1 :(得分:1)
嗯,DotNetZip有一个简单的API,所以你可以这样做:
byte[] compressedProperty;
public string MyProperty
{
get { DeflateStream.UncompressString(compressedProperty); }
set { compressedProperty = DeflateStream.CompressString(value); }
}
不确定它是否能在你的表现方面表现出色。
<强>更新强>:
我只知道GZipStream
和DeflateStream
类。它们都没有公开string
接口。当你调用上面的函数时,甚至DotNetZip都会使用一个流,它只是围绕一个漂亮的界面(你可以自己使用System.IO.Compression
类)。不知道你的问题是什么。
如果你真的想避免使用流,那么你可能需要自己进行压缩。 Here is a guy使用简单的霍夫曼编码器对F#中的字符串进行编码。不知道它有多好用,但我想避免使用第三方库和流,那么你可以给它一个破解。