用于存储大量标志集的非常大的持久容器
Posted
技术标签:
【中文标题】用于存储大量标志集的非常大的持久容器【英文标题】:Very big persistent container for storing large amount of flags sets 【发布时间】:2013-07-25 12:55:16 【问题描述】:问题如下:我有一定数量的单词(比如说20M),每个单词都包含一些用作标志的位;全部存储在单个连续的二进制文件中。
我想做的是以 container like 样式访问这些单词,因此 container_instance[i]
允许我访问 i-th 单词。为了让事情变得更复杂,我不能一次将所有单词存储在内存中,它们必须存储回文件并为那些长期不使用的单词释放内存。为了简化事情,整个序列被划分为 1K 个片段,所以我们需要释放和分配这样的 1K 个块。内存应该在一段时间或容器被访问一定次数后被释放。
很高兴拥有线程安全。但我可以在外部保护。
我目前的实现只按需分配块(如果可用,则为空或从文件中读取;文件不是稀疏的,因此文件中最后一个字节之后的所有内容都分配为空)并且做得不好。根本不释放,所以未使用的块永远保留在内存中。
我开始考虑美观的解决方案,我想知道是否有任何来自 STL 或 Boosts 的元素可以帮助我构建这样的容器,而不是从头开始逐步雕刻它?
我并不期待完整的解决方案,而是指出“您可以将 that 用于 that”。
【问题讨论】:
boost
是一个帮助:他们构建迭代器的东西(如fascade
)将帮助您创建随机访问迭代器。
使用 64 位系统和mmap
。完毕。读=页入,空闲=页出。你无法击败与 CPU 一起工作的操作系统。
我不能使用mmap()
,因为我必须通过包装器访问文件,因为代码不能依赖于 POSIX 或任何其他操作系统的东西。它就像嵌入式代码。
【参考方案1】:
您可以使用mmap 系统调用将您的文件映射到内存中。您可以对该缓冲区使用指针运算,因此按索引访问并不麻烦。
映射页面是虚拟的并由内核管理,允许保存未使用的内存块并以对您透明的方式加载/刷新它们。此外,使用madvise 可能会启用一些优化。
【讨论】:
以上是关于用于存储大量标志集的非常大的持久容器的主要内容,如果未能解决你的问题,请参考以下文章