我很难用SSD上的哈希数组存储数亿个16/32字节的键/值对。

与Kyoto Cabinet一起使用:如果工作正常,它将以70000条记录/秒的速度插入。一旦下降,它将下降到10-500条记录/秒。使用默认设置,删除大约在一百万条记录后发生。查看文档,这是阵列中默认的存储桶数,因此很有意义。我将该数字增加到2500万,实际上,直到大约2500万记录,它都可以正常工作。问题是,一旦我将存储桶的数量推到3000万或更多,插入速度便从一开始就下降到10-500条记录/秒。创建数据库后,京都府内阁并不是为了增加存储桶的数量而设计的,因此我不能插入超过2500万条记录。

1/当存储桶数超过25M时,为什么KC的插入率会变得很低?

使用Berkeley DB时:我获得的最佳速度略低于KC,接近50000记录/秒,但仍然可以。与KC一样,使用默认设置时,速度在大约一百万条记录后突然下降。我知道BDB旨在逐步扩展其存储桶的数量。无论如何,它都尝试使用HashNumElements和FillFactor来增加初始数量,但是任何这些尝试都使情况变得更糟。因此,我仍然无法使用DBD插入超过1-2百万条记录。我尝试激活非同步事务,尝试使用不同级别的检查点,并增加了缓存。没有什么可以改善下拉菜单的。

2/是什么导致1-2百万次插入后BDB的插入率下降?

注意:我正在使用Java,并且当速度下降时,以正确的速度工作时,CPU使用率降低到0-30%,而在100%时。
注意:停止进程并恢复插入不会改变任何内容。所以我认为这与内存限制或垃圾回收无关。

谢谢。

最佳答案

以下是尽管遇到了KC的书写限制,但我还是设法存储了数十亿条记录。

尽管付出了很大的努力,京都府内阁和伯克利DB仍未解决问题。但是我想出了一个使用京都内阁的有趣解决方法。

我注意到我不能在一个KC文件上写入超过2500万条记录,但是读取没有这样的限制-无论数据库的大小如何,读取速度总是很快的。我发现的解决方案是为每25M条新记录创建一个新的KC文件(新数据库)。这样,可以在许多KC文件上进行读取,并且读取速度仍然很快,而写入仅在最后创建的文件上进行,写入速度也很快。唯一剩下的问题是允许更新/删除先前文件中的记录。为此,我复制了SSTables方法,即:

  • 0至N-1个文件均为只读,文件N为读写。
  • 任何插入/更新/删除都写在文件N中。
  • 读入N到0的文件,并返回首次看到/最后写入的插入/更新/删除。
  • 每个文件都附加了Bloom筛选器,以避免访问没有所需记录的文件。
  • 文件N一旦达到25M记录,它将变为只读并创建文件N + 1。

  • 注意事项:
  • 与SSTables一样,如果执行了许多更新/删除操作,我们可能要执行压缩。但是与SSTables相反,此处的压缩不需要重写文件。只需从KC文件中删除过时的记录,并且如果KC文件变得很小,则可以将其删除-将记录重新插入文件N-或重新打开以插入新文件-只要下一个文件紧凑即可。
  • 删除操作不会删除记录,而是会写一个特殊值来将记录标识为已删除。压缩期间,删除的记录将被删除。
  • 检查记录是否存在通常需要查询数据库。多亏了布隆过滤器,大多数否定答案都可以在没有任何磁盘访问的情况下给出。
  • 09-26 03:06