非常に多くの(実行時に修正された、約1,000万から3,000万の)アレイがあります。各配列は、それぞれ6バイトの0〜128個の要素です。
すべての配列をmmapされたメモリに格納する必要があり(mallocを使用できないため)、配列は動的に拡張できる必要があります(最大128要素で、配列は縮小しません)。
私は、mmapされたメモリ内の6バイトの各ブロックの状態を表すint配列を持つという単純なアプローチを実装しました。オフセットでの0xffffffffの値は、mmapされたメモリ内の対応するオフセットが空いていることを表します。その他の値は、配列のIDです(現在の実装ではブロックの最適化に必要です。ブロックは、なしでは移動できません。他のデータ構造を更新するために配列のIDを知っている)。割り当て時に、配列が割り当てを超えた場合、十分な空きブロックが見つかるまで単純に反復し、対応するオフセットに挿入します。
これは、割り当て配列とmmapされたメモリがどのように見えるかです。
| 0xffffffff | 0xfffffff | 1234 | 1234 | 0xffffffff | ...
-----------------------------------------------------------------
| free | free |array1234[0]|array1234[1]| free | ...
offset of furthest used block in mmap'ed memory x 4
ただし、このアプローチには(4バイトの整数)
のメモリオーバーヘッドがあります。
この特定のケースには、どのようなより良いアプローチがありますか?
これに対する私の理想的な要件は次のとおりです。
- メモリオーバーヘッド(任意の割り当てテーブル+未使用スペース)<=要素あたり1.5ビット+配列あたり4*6バイト
- O(1)配列の割り当てと拡張