我有一大串字符串存储在一个巨大的内存块中(通常有 100k+ 甚至 1M+)。这些实际上是散列,因此字符串的字母表仅限于 A-F0-9,并且每个字符串的长度正好为 32 个字节(因此其存储的“压缩”)。从现在开始,我将把这个列表称为主列表。
我希望能够从主列表中删除项目。这通常是批量完成的,所以我得到一个大的哈希列表(通常大约 100 到 10k),我需要在这个列表中找到并删除它们。在这个操作结束时,大内存块中不能有任何空块,所以我需要考虑到这一点。不能保证所有项目都在主列表中,但没有一个项目会多次出现。不能重新分配,主块将始终保持相同的大小。
遍历主列表并检查是否应删除给定哈希的幼稚方法当然可行,但有点慢。此外,小内存块的移动有点过多,因为每次将哈希标记为删除时,我都会用主列表的最后一个元素重写它,从而满足没有空块的条件。这当然会创建数以千计的小型 memcpy,这反过来又会减慢速度,因为我有大量的缓存未命中。
有更好的方法吗?
一些重要的注意事项:
- 主列表未排序,我不能浪费时间对其进行排序,这是整个项目施加的限制并重写它,因此列表始终排序不是一个选项(甚至可能不可能)
- 内存不是问题,但越少越好
- 我可以使用 STL,但不能提升