c# - 有没有办法压缩内存中的对象并透明地使用它?

标签 c# object memory compression .net-4.5

我目前正在构建一个处理大量数据的分析应用程序。典型情况如下所示:用户选择一个文件夹,其中包含大约 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/

相关文章:

javascript - JQuery 设置后找不到 .NET 隐藏字段值

python - Redis:内存优化/性能策略

java - 根据用户选择创建新对象

c++ - cuda 共享内存 - 结果不一致

c - 内存未分配(嵌入式 uC MSP430)

c# - 从脚本获取时 Unity3d 输入字段文本被截断?

c# - 如何检查 Html 元素是否在 WebBrowser 控件 C# 中具有背景图像 css 属性

c# - 类方法所需的资源

javascript - 合并对象数组内的两个对象

python - 总结类实例