加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 06:17:43 所属栏目:百科 来源:网络整理
导读:我目前正在构建一个处理大量数据的分析应用程序.典型情况如下:用户选择包含大约600个测量文件的文件夹,每个文件包含大约40.000到100.000个值.应用程序将这些值读入一个内部作为数据高速缓存的对象,这样就不能在每次访问时读取这些文件. 这非常有效,但我注意
我目前正在构建一个处理大量数据的分析应用程序.典型情况如下:用户选择包含大约600个测量文件的文件夹,每个文件包含大约40.000到100.000个值.应用程序将这些值读入一个内部作为数据高速缓存的对象,这样就不能在每次访问时读取这些文件.

这非常有效,但我注意到内存消耗非常高,最终可能会变得太大.在我的测试期间,当应用程序的内存消耗超过2GB RAM时应用程序崩溃.

保存数据的数据结构尽可能简单,它基本上只包含一些以2级嵌套方式包含数据的字典,没有任何复杂.我想知道是否有一种方便的方法将这个对象以压缩形式存储在RAM中.我知道这会降低性能,但在我的情况下这完全可以接受.

有没有办法做这样的事情让我像往常一样使用我的对象?或者我必须在我的对象中自己实现压缩?

感谢您的想法和建议!

解决方法

这实际上取决于您正在使用的类型.一种可能性是压缩对象,使用 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);
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读