我很难用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方法,即:
注意事项: