我有一个非常大(在运行时固定,大约 10 - 3000 万)的数组。每个数组包含 0 到 128 个元素,每个元素为 6 个字节。
我需要将所有数组存储在 mmap 内存中(所以我不能使用 malloc),并且数组需要能够动态增长(最多 128 个元素,并且数组永远不会缩小)。
我实现了一种简单的方法,即使用一个 int 数组来表示 mmap 内存中每个 6 字节块的状态。偏移量处的 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 字节 ber int)的内存开销。
对于这种特定情况,有什么更好的方法?
我对此的理想要求是:
- 内存开销(任何分配表 + 未使用空间)<= 每个元素 1.5 位 + 每个数组 4*6 字节
- O(1) 数组的分配和增长