C#中的高效小字节数组

时间:2017-07-06 20:35:07

标签: c# arrays memory encoding compression

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

在内存分析后,我发现这些字节数组总是占用至少32个字节

有没有办法比bit-fiddled更紧凑地存储信息到byte []?指向非托管阵列会更好吗?

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); } }
}

1 个答案:

答案 0 :(得分:1)

你面临着一些吃掉记忆的问题。一个是对象开销,另一个是对齐32或64位边界的对象(取决于您的构建)。您当前的方法都存在两个问题。以下来源更详细地描述了这一点:

当我fiddling with benchmarking sizes时,我玩弄了这个。

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

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