用于存储大量128位整数的磁盘结构?

时间:2010-11-18 09:08:51

标签: data-structures on-disk

我有大约5亿个128位整数,每年增加大约1亿个。什么都没有删除。这些数字是统一分布,按比例和时间分布。

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

到目前为止,我们一直在MySQL上使用几个MyISAM表,使用两个bigint作为主键。这给了我们好的表现,但我怀疑它不适合这项工作。在拆分表之前我们遇到了一些性能问题,而且我们在停电时已经损坏了。此外,DB为我们提供了许多我们不需要的功能。

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

Similar question in C++

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

2 个答案:

答案 0 :(得分:3)

将每个整数插入2个 n 的池中的一个SQLite数据库(2 8 可能是一个很好的数字)通过计算 n - 整数的比特哈希值。使一个表的一列成为主键,以便尝试插入现有数字失败。

假设整数已经足够随机,你可以选择最不重要的字节作为“哈希”。

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

我开始认为这是一个真正有趣的问题,可以通过定制解决方案更有效地解决。但是,我怀疑它需要花费大量精力才能明显优于数据库引擎。

答案 1 :(得分:0)

哈希你的哈希?