Java:快速磁盘
我需要存储一个大的哈希集,能够包含大约2亿个40位值。 将它存储为2亿个64位值是可以接受的(尽管有2亿* 16位丢失)。
要求是:
微小的内存占用(磁盘空间不是问题,内存是)
fast contains(long l)
和add(long l)
方法(比SQL快得多)
嵌入式
免费且没有恶意许可(没有Berkeley DB)。 LGPL罚款。
没有误报,也没有误报,所以像基于磁盘的Bloom Filters这样的事情并不是我所追求的
SQL不是我在这里之后。
因为我真的认为自己更像这样快速(注意解决方案比SQL解决方案快得多):
快速的基于磁盘的哈希表?
Google是否有这样的Java API?
一个快速的基于磁盘的键/值对实现在哪里我只使用'键'工作?
或者是其他东西?
我宁愿不重新发明weel。
如果您可以支付128 GB的磁盘,则可以每40位值存储一位数据。 然后您可以使用随机访问文件来检查已设置的位或更改它。 您不必插入任何值或维护索引。
尝试使用sg-cdb(djb的cdb的奇怪的gizmo端口),然后用BufferedRandomAccessFile替换RandomAccessFile(在jai-imageio代码中有一个很好的端口)。
我正在令人兴奋的写作表现。 通过屋顶(因为它全部缓冲,然后一举实施)。 然而,读缓冲RAF的性能并没有改变。
我可以花时间与H2批量进口进行比较,虽然不确定,但可能具有可比性。
数据库很简单:key => value。 查找只支持密钥。 键是我的情况(base32编码的随机ints + base32编码的唯一int),所以本地应该不会有太大的帮助。 这些值是120个随机字节的数组。
加载(sql插入)
h2,具有131MB缓存(包括刷新,不启动):
2011年5月4日上午11:45:10 test.TestH2Simple main:inserts perform added in:101625 ms
数据库大小:大约140 MB
批量大小:2000:插入执行添加:116875毫秒
批量大小:10000:insertsperformed添加在:70234 ms
与cdb的sg-cdb(奇怪的gizmo)端口比较:
使用RandomAccessFile:插入不刷新:21688毫秒,刷新:30359毫秒,总计:52047毫秒磁盘上的文件大小:66.1 MB(69,315,632字节)
与BufferedRandomAccessFile:大约6.5秒
当然,这并不是一个公平的比较,因为H2在插入过程中连续刷新数据,而sg-cdb不是。 执行比较时必须记住这一点。 可能公平的是将sg-cdb插入片段与H2插入片段进行比较
读取(sql select)
SG-CDB
:搜索:490000完成:1304544550439占用:17547毫秒,计数器:0
H2
:选择在:19579毫秒执行
关于内存映射文件:他们似乎不是你想要的。 MMap文件的出色表现是当你将大约100MB或更多的内存映射到内存中时(我的经验)。
我相信你需要使用B树而不是哈希表。 哈希表对于辅助存储没有很好的局限性,所以您将失去太多的时间用于磁盘I / O。
大多数数据库(无论是否为关系数据库)都将它们的索引实现为B树,因此您正在讨论的是等同于存储索引而没有附加其他数据的索引。
你会有多个进程同时更新这个数据存储吗?
链接地址: http://www.djcxy.com/p/44987.html上一篇: Java: fast disk