我有一个哈希映射(文本和布尔值之间的多对一关系):
name flag
---------------------
"abc" TRUE
"cde 12" TRUE
"foo" FALSE
"some text" TRUE
etc...
我需要在Java应用程序中保留此结构。这种结构将被扩展,但从未改变。这意味着我将向其添加新记录,但从不删除或更改现有记录。最重要的是搜索速度(我提供name
并返回flag
)。它可能非常大(数百万条记录)。我考虑了很多选项:1)关系数据库有一个表和一个索引,2)平面文件,3)纯JVM数据库..你会建议什么?
答案 0 :(得分:5)
我建议 JDBM3 库提供磁盘支持的HashMap和TreeMap实现。它快速,可扩展且易于使用。 Apache 2许可证。
来自网站:
JDBM has outstanding performance; it can insert a million records per second and read them even faster
答案 1 :(得分:1)
根据当时记录的数量,我会使用关键字数据库来锁定名称。
但如果找不到名字,这应该是什么意思?
如果找不到相当于你的一个布尔值(比如TRUE)那么你有一个白名单(或黑名单取决于上下文),在这种情况下,我倾向于从数据库中删除标志列并缓存名称哈希集。
如果未找到单独的值,那么如果您有足够的可用内存,则可以尝试在哈希映射中缓存整个表。
答案 2 :(得分:0)
多少百万?我们有一个包含5mil记录数组的案例,并且我们已经将所有内存都吸引到了使用二进制搜索获得快速结果的情况下,如果你有很多地址,那么这是一个带有重复数据的地理数据,latitiudes数据和数据库搜索需要很长时间去查查看。 如果你有很多内存使用内存数组,如果没有 - 使用一个小数据库sqlite或mysql。 sqlite也可以处理大量数据,如果没有很多线程客户端会更新你的结构,则不需要额外的服务器。 关于sqlite的限制 - Can SQLite handle 90 million records?