2017-07-06 38 views
0

我有一个非常小的对象的巨大集合。为了确保数据存储非常紧凑,我重写了类,以便将所有信息以可变字节编码存储在字节数组中。这些数百万个对象的大多数实例只需要3到7个字节来存储所有数据C中有效的小字节数组#

内存分析后,我发现这些字节数组总是至少需要32字节

有没有一种方法可以将信息存储得比字节[]更紧凑?指向非托管阵列会更好吗?

class MyClass 
{ 
    byte[] compressed; 

    public MyClass(IEnumerable<int> data) 
    { 
     compressed = compress(data); 
    } 

    private byte[] compress(IEnumerable<int> data) 
    { 
     // ... 
    } 

    private IEnumerable<int> decompress(byte[] compressedData) 
    { 
     // ... 
    } 

    public IEnumerable<int> Data { get { return decompress(compressed); } } 
} 
+0

我添加了代码。我必须存储一些非常小的整数 - 因此可变字节编码。 – user2033412

+0

这似乎是一个“问题”,与您在创建数组之前创建数组的方式有关。你能提供压缩方法的源代码吗? –

+1

问题的一部分是对象开销,在64位版本中更糟糕。这有一些关于这方面的信息:[内存和字符串](https://blogs.msmvps.com/jonskeet/2011/04/05/of-memory-and-strings/) – hatchet

回答

1

有你面临着吃内存一对夫妇的问题。一个是对象开销,另一个是对象对齐到32或64位边界(取决于你的构建)。您目前的方法受到这两个问题的困扰。以下资料描述得更详细:

我这个玩,当我是fiddling with benchmarking sizes

一个简单的解决方案就是简单地创建一个具有长整型值的单个成员的结构。它的方法将使用移位和掩码位摆弄来处理打包和解包字节的进出。

另一种想法是通过ID提供对象的类,并将实际字节存储在单个后台List<byte>中。但是这会变得复杂和混乱。我认为结构想法更直接。

+0

我虽然很多关于一个大的支持数组和只存储索引 - 但像你说的:这将是混乱。 – user2033412