我目前正在构建一个处理大量数据的分析应用程序。典型情况如下所示:用户选择一个文件夹,其中包含大约 600 个测量文件,每个文件包含大约 40.000 到 100.000 个值。应用程序将这些值读入一个对象,该对象在内部用作数据缓存,因此不必在每次访问时都读取文件。
这很好用,但我注意到内存消耗非常高,最终可能会变得太大。在我的测试中,当应用程序的内存消耗超过 2GB 的 RAM 时,应用程序崩溃了。
保存数据的数据结构尽可能的简单,它基本上只是由一些字典组成,字典以2级嵌套的方式包含数据,没什么复杂的。我想知道是否有一种方便的方法可以将此对象以压缩形式存储在 RAM 中。我知道这会降低性能,但在我的情况下这是完全可以接受的。
有没有办法让我像往常一样使用我的对象?还是我必须在我的对象中自己实现压缩?
感谢您的想法和建议!
最佳答案
这实际上取决于您正在使用的类型。一种可能性是压缩您的对象,将它们保存为压缩的 byte[]
而不是使用 Extension Method 的原始对象格式。 .
您可以将其与使您的流程工作 x64 位相结合:
public static byte[] SerializeAndCompress(this object obj)
{
using (MemoryStream ms = new MemoryStream())
using (GZipStream zs = new GZipStream(ms, CompressionMode.Compress, true))
{
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(zs, obj);
return ms.ToArray();
}
}
public static T DecompressAndDeserialize<T>(this byte[] data)
{
using (MemoryStream ms = new MemoryStream(data))
using (GZipStream zs = new GZipStream(ms, CompressionMode.Decompress, true))
{
BinaryFormatter bf = new BinaryFormatter();
return (T)bf.Deserialize(zs);
}
}
关于c# - 有没有办法压缩内存中的对象并透明地使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23651650/