2012-01-23 29 views
1

我有一个哈希表(多到一个文本和布尔值之间的关系):坚持HashMap的最有效方法是什么?

name   flag 
--------------------- 
"abc"  TRUE 
"cde 12"  TRUE 
"foo"  FALSE 
"some text" TRUE 
etc... 

我需要坚持在Java应用程序中这种结构。这种结构将被延伸,但从未改变。这意味着我将添加新记录,但不会删除或更改现有记录。什么是非常重要的是搜索的速度(我提供了一个name,它返回flag)。它可能真的很大(数百万条记录)。我认为有多种选择:1)具有一个表和一个索引的关系数据库,2)平面文件,3)纯JVM数据库。您会提出什么建议?

回答

5

我建议JDBM3库提供支持的HashMap和TreeMap实现的磁盘。它的快速,可扩展和易于使用。 Apache 2许可证。

从网站:

JDBM has outstanding performance; it can insert a million records per second and read them even faster

+0

我认为这是对我最好的选择,但他们还没有在Maven的中央:https://github.com/jankotek/JDBM3/issues/31 – yegor256

1

鉴于记录的数量,我会用名字上的关系数据库去。

但是,如果找不到名字,这意味着什么?

如果找不到相当于你的一个布尔值(如TRUE),那么你有一个白名单(或黑名单取决于上下文),在这种情况下,我倾向于从数据库中删除标志列并缓存名称在一个哈希集。

如果找不到是一个单独的值,那么如果您有足够的可用内存,您可以尝试将整个表缓存在哈希映射中。

0

有多少百万?我们有一个5mil记录的例子,我们在内存中使用二进制搜索来获取快速结果,它是带有结果数据和latitiudes数据的geoloc数据,如果你有很多地址,那么数据库搜索会花费很长时间去查查看。 如果你有很多内存使用内存数组,如果不是的话 - 使用一个小的数据库,不管是sqlite还是mysql。 sqlite也可以处理大量的数据,如果没有多少线程客户端会更新你的结构,不需要额外的服务器。 约源码的限制 - Can SQLite handle 90 million records?

相关问题