如何在文件中存储哈希表?

时间:2009-02-07 18:51:39

标签: c++ algorithm serialization data-structures hashtable

如何在磁盘上的文件中存储具有单独链接的哈希表?

在运行时生成存储在哈希表中的数据是很昂贵的,从磁盘加载HT会更快......如果我能弄明白怎么做。

编辑: 查找是通过加载到内存中的HT完成的。我需要找到一种方法将哈希表(在内存中)以某种二进制格式存储到文件中。因此,下次程序运行时,只需将HT磁盘加载到RAM中即可。

我正在使用C ++。

6 个答案:

答案 0 :(得分:6)

您使用的是哪种语言?常用的方法是进行二进制序列化。

好的,我看到您已编辑添加语言。对于C ++,有一些选择。我相信Boost序列化机制非常好。此外,Boost序列化库的页面还描述了替代方案。这是链接:

http://www.boost.org/doc/libs/1_37_0/libs/serialization/doc/index.html

答案 1 :(得分:5)

假设C / C ++:使用数组索引和固定大小的结构而不是指针和可变长度分配。您应该能够直接将()数据结构写入文件以便稍后读取()。

对于更高级别的东西:许多高级语言API都有序列化工具。 Java和Qt / C ++都有立即冲刺的方法,所以我知道其他人也这样做。

答案 2 :(得分:5)

您可以使用序列化(例如in Java)将整个数据结构直接写入磁盘。但是,您可能被迫将整个对象读回内存以访问其元素。如果这不可行,那么您可以考虑使用random access文件来存储哈希表的元素。您只需使用文件中的字节位置,而不是使用指针来表示链中的下一个元素。

答案 3 :(得分:4)

抛弃指数的指针。

这有点像构建磁盘上的DAWG,我做了一段时间。让它非常甜蜜的原因是它可以直接用mmap加载而不是读取文件。如果哈希空间是可管理的,比如2 16 或2 24 条目,那么我想我会做这样的事情:

  • 保留免费索引列表。 (如果表为空,则每个链索引都指向下一个索引。)
  • 当需要链接时,请使用表格中的可用空间。
  • 如果你需要把一些东西放在一个被擅自占地者占用的索引中(从其他地方溢出):
    • 记录索引(我们称之为N)
    • 交换新元素和擅自占地者
    • 将擅自占地者放入新的自由指数(F)。
    • 按照擅自占地者的哈希索引链接,用F替换N。
  • 如果你完全没用免费索引,你可能需要一个更大的桌子,但是你可以通过使用mremap在桌子后创建额外的空间来应对更长的时间。

这应该允许您直接mmap并使用该表,而无需修改。 (如果在OS缓存中速度很快!)但你必须使用索引而不是指针。在syscall-round-trip-time中有兆字节可用是非常怪异的,并且由于分页,它仍然比物理内存中的数量少。

答案 4 :(得分:2)

也许DBM对您有用。

答案 5 :(得分:1)

如果您的哈希表实现有任何好处,那么只需存储哈希值和每个对象的数据 - 将一个对象放入表中应该不会是昂贵的给定哈希值,而不是直接序列化表或链让您改变确切的保存和加载之间的实现。