Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:基于磁盘的快速散列集_Java_Hashset_Disk Based - Fatal编程技术网

Java:基于磁盘的快速散列集

Java:基于磁盘的快速散列集,java,hashset,disk-based,Java,Hashset,Disk Based,我需要存储一个大的散列集,能够包含大约2亿个40位的值。将其存储为2亿64位值是可以接受的(尽管有2亿*16位的丢失) 这些要求是: 内存占用小(磁盘空间不是问题,内存是) fast包含(长l)和添加(长l)方法(比SQL快得多) 嵌入 免费且无恶意许可(无Berkeley DB)。好的 没有假阳性和假阴性,所以像基于磁盘的Bloom过滤器之类的东西不是我想要的 SQL不是我想要的 因为我真的认为我更追求这样快的东西(注意这个解决方案比SQL解决方案快得多): 谷歌有这样的JavaAPI吗

我需要存储一个大的散列集,能够包含大约2亿个40位的值。将其存储为2亿64位值是可以接受的(尽管有2亿*16位的丢失)

这些要求是:

  • 内存占用小(磁盘空间不是问题,内存是)

  • fast
    包含(长l)
    添加(长l)
    方法(比SQL快得多)

  • 嵌入

  • 免费且无恶意许可(无Berkeley DB)。好的

  • 没有假阳性和假阴性,所以像基于磁盘的Bloom过滤器之类的东西不是我想要的

SQL不是我想要的

因为我真的认为我更追求这样快的东西(注意这个解决方案比SQL解决方案快得多):

谷歌有这样的JavaAPI吗

我只使用“键”的快速基于磁盘的键/值对实现会起作用吗

还是别的什么


我不想重新发明weel。

如果你能负担得起128 GB的磁盘,你可以每40位值存储一位。
然后,您可以使用随机访问文件检查位是否设置或更改它。您不必插入任何值或维护索引。

我相信您将需要使用B树而不是哈希表。哈希表对于辅助存储没有良好的局部性,因此您将损失太多的磁盘I/O时间

大多数数据库——不管是关系型数据库还是非关系型数据库——都将其索引实现为B-树,因此您讨论的是存储索引时不附加其他数据的等效方法

是否有多个进程同时更新此数据存储?

尝试sg cdb(djb cdb的奇怪gizmo端口),然后用BufferedRandomAccess文件交换RandomAccess文件(jai imageio代码中有一个很好的文件)

我得到了令人兴奋的写作表演。通过屋顶(因为它的所有缓冲,然后在一个猛扑承诺)。 不过,缓冲RAF的读取性能没有改变

我可以花点时间与H2批量进口进行比较,可能是可比的,但不确定

数据库很简单:key=>value。仅支持对密钥进行查找。 在我的例子中,密钥是(base32编码的随机整数+base32编码的唯一整数),因此局部性应该没有多大帮助。这些值是120个随机字节的数组

加载(sql插入) h2,带131MB缓存(包括刷新,不启动): 2011年5月4日11:45:10 PM test.testh2简单main :执行的插入添加到:101625毫秒

数据库大小: 大约140 MB

批量:2000 :执行的插入添加到:116875 ms

批量:10000 :insertsperformed添加到:70234 ms

与cdb的sg cdb(奇怪的gizmo)端口相比: 使用随机访问文件: 无冲洗插入:21688毫秒,冲洗:30359毫秒,总计:52047毫秒 磁盘上的文件大小: 66.1 MB(69315632字节)

使用BufferedRandomAccess文件: 大约6.5秒

当然,这不是一个真正公平的比较,因为H2在插入期间不断刷新数据,而sg cdb则不是。在进行比较时,必须牢记这一点。比较sg cdb插入和H2批量插入可能是公平的

读取(sql选择) 新加坡国开行 :搜索次数:490000 完成时间:130454450439拍摄时间:17547毫秒,计数器:0

氢 :选择在:19579毫秒内执行

关于内存映射文件:
它们似乎不是你想要的。MMap文件的最佳性能是将大约100MB或更大的内存映射到内存中(我的经验)。

2亿大约是28位。@Thorbjorn:我说的是存储2亿个值,每个值是40位。我从来没有说过存储的值可能包含高达2亿的值:)出于好奇,您是否用SQLite等尝试过它?我在问题中没有看到任何证据表明你链接到OP关闭了日志记录,甚至创建了索引…@Steven Huwig:没有,我指定SQL不是我之后要做的。。。当我谈论一些快速的问题时,我想到了更多的答案,比如Peter Lawrey提出的答案:)你真的认为在与花时间调优SQLite相关的答案中,会接近公认的答案吗?这个答案特别指出它是围绕SQL运行的?我们不关心关系属性,也不关心ACID保证等。对于这样简单的问题,SQL是一个巨大的过度负担。换句话说,这是一把金锤。@Steven Huwig:我们正在使用Java进行高性能计算(实际上Java在这方面做得很好)。游戏的名字是优化。我问了一个非常具体的问题,不太露骨,并明确表示SQL不是我想要的。我不是要“SQL”和“XML”类型的答案。我想要的答案就像彼得·劳瑞做的一样。@彼得·劳瑞:有趣。。。有趣的是,在此之前,我还有另一个问题,我问Java中实现大文件随机查找的最快方法是什么:)遗憾的是,这在我的情况下是不可行的:这必须安装在多台计算机上。几GB是可以的,但128太多了:(我喜欢上面所说的方法……你也可以使用Bloom过滤器,大约需要6位,1%的误报率。请检测密钥是否存在。如果这是你正在寻找的操作。如果数据是静态的,也可以使用具有高扇出的树。