2017-07-06 15 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

あなたが直面しているいくつかの問題があります。 1つはオブジェクトオーバーヘッドで、もう1つは32ビットまたは64ビットの境界に合わせるオブジェクトです(ビルドによって異なります)。あなたの現在のアプローチは両方の問題に苦しんでいます。次のソースは、これをより詳細に説明します

私はfiddling with benchmarking sizesだったとき、私はこれで遊ん。

単純な解決策は、単一のメンバーが長い値を持つ構造体を単純に作成することです。そのメソッドは、シフトとマスクビットの操作を使用して、その長さの内外へのバイトのパッキングとアンパックを処理します。

もう1つのアイデアは、IDでオブジェクトを提供し、実際のバイトを単一のバッキングList<byte>に格納するクラスです。しかし、これは複雑で面倒なものになるでしょう。構造体のアイデアははるかに簡単だと思います。

+0

私は大きなバッキングアレイとインデックスだけを格納していますが、あなたが言ったように、それは面倒です。 – user2033412

関連する問題