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

时间:2014-05-14 10:10:25

标签: c# object memory compression .net-4.5

我目前正在构建一个处理大量数据的分析应用程序。典型情况如下:用户选择包含大约600个测量文件的文件夹,每个文件包含大约40.000到100.000个值。应用程序将这些值读入一个内部作为数据高速缓存的对象,这样就不能在每次访问时读取这些文件。

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

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

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

感谢您的想法和建议!

3 个答案:

答案 0 :(得分:13)

这实际上取决于您正在使用的类型。一种可能性是压缩对象,使用Extension Method将其保持为压缩byte[]而不是原始对象格式。

你可以将它与使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);
    }
}

答案 1 :(得分:0)

“ Yuval Itzchakov”的代码有错误!他在关闭压缩机之前执行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(); } }: 。 这将导致DecompressAndDeserialize方法出错。

此代码将起作用:

Try this,
   Fragment fragment = new Fragment_class();
    FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.container_body, fragment).addToBackStack(null);
        fragmentTransaction.commit(); 

答案 2 :(得分:-1)

对我来说,它只有在以这种方式更改后才起作用。在上面的示例中,我执行了一个“ serializationexception未标记为可序列化的”。不要忘记在您的课程中添加“ [Serializable()]”。

public static byte[] SerializeAndCompress(this object obj) 
{
    var 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);
    }
}