5

我有大约 5 亿个 128 位整数,每年增加大约 1 亿个。什么都不会被删除。这些数字在规模和时间上是均匀分布的。

基本上,我需要的只是一个添加操作,它还返回数据库中是否已经存在该数字。另外,我不想为这个系统使用太多的 RAM,所以只是将所有内容存储在内存中并不是我想要的。

到目前为止,我们已经在 MySQL 上使用了几个 MyISAM 表,使用两个 bigint 作为主键。这给了我们不错的性能,但我怀疑它不是这项工作的正确工具。在拆分表之前,我们遇到了一些性能问题,并且我们在断电时遇到了损坏。此外,数据库为我们提供了更多我们不需要的功能。

我在 Linux 上使用 Python,但我愿意接受建议。

C++ 中的类似问题

更新:Marcelo 的评论提到了Bloom Filter,这对我来说似乎很有希望。由于我正在使用哈希,我已经放弃了完全的准确性,所以这可能是一个很好的精度/性能折衷。

4

2 回答 2

3

将每个整数插入通过计算整数的n位散列选择的 2 n 个SQLite 数据库池中的一个(2 8可能是一个不错的数字) 。将一个表的一列设为主键,这样尝试插入现有数字就会失败。

假设整数已经足够随机,您可能只需选择最低有效字节作为“哈希”。

编辑:我做了一些测试。我在大约两个小时内插入了 2500 万个条目,但在此过程中它已经吞噬了超过 1 GB。这是通过生成随机数并将它们分配给 32 个子进程来完成的,每个子进程都有一个受其控制的 SQLite 数据库,并且每 100,000 次插入提交一次。目前插入的频率约为 1350 Hz,远远超出了您的问题所需的 3 Hz,但整个数据库仍然适合缓存(我有 8 GB RAM)。除非我接近您当前的数据库大小,否则我不会知道稳态性能。到那时,每次插入都会引起至少四次磁盘磁头移动(读取和写入索引和表,可能更多以深入 B+ 树),然后你就会知道你真正处于多么痛苦的境地.

我开始认为这是一个真正有趣的问题,可以通过定制解决方案更有效地解决。但是,我怀疑要显着超越数据库引擎需要付出合理的努力。

于 2010-11-18T09:54:41.097 回答
0

散列你的散列?

于 2010-11-18T13:20:01.940 回答