我基本上想在磁盘上存储哈希表,以便稍后查询。我的程序是用Java编写的。 哈希表从String到List。
那里有很多键值商店,但经过大量的研究/阅读后,不清楚哪一个最适合我的目的。以下是一些对我很重要的事情。
我研究过Redis和MongoDB。两者看起来很有希望但不适合我的目的。 任何信息将不胜感激。
答案 0 :(得分:4)
您正在寻找的是支持object prevalence的库。这些库旨在简单快速地提供类似API的集合。下面是一些允许您使用集合但在幕后使用磁盘存储的库。
答案 1 :(得分:3)
如果您的数据集很小并且您希望它是简单的。为什么不将hashmap序列化为文件或rdbms并将其加载到应用程序中?
你怎么不“查询”你的hashmap?关键近似?价值'相似'?我不知道,仅仅是为了保留一个关键值存储对我来说似乎有点过分。
答案 2 :(得分:2)
查看JDBM2 - http://code.google.com/p/jdbm2/
我参与了JDBM 1代码库,并对我在jdbm2中看到的内容印象深刻
答案 3 :(得分:2)
在提供任何类型的答案之前,我首先要问自己为什么我需要将此哈希表存储在磁盘上,因为根据您的描述,数据集很小,所以我认为它可以适合内存。如果只是为了能够在重新启动应用程序后重用此结构,那么您可以使用任何类型的格式来保留它。
其次,您没有提供Redis或MongoDB不理想的任何理由。根据你的(短)3要求,我会说Redis可能是你最好的选择:
我可以假设消除Redis的唯一原因是您正在寻找严格的ACID特性。如果这就是你要找的东西,你可能会看看BerkleyDB JE。它已经存在了一段时间,文档很好。
答案 4 :(得分:0)
Chronicle Map应该是一个完美的契合,它是一个用纯Java编写的可嵌入键值存储,因此它可以作为最好的"客户端" (虽然实际上没有"客户端"或者#34;服务器",您只需打开数据库并对其进行完全读取/更新进程内访问。)
Chronicle Map驻留在一个文件中。这个文件可以在文件系统中移动,甚至可以发送到具有不同操作系统和/或体系结构的另一台机器,并且仍然是一个可打开的Chronicle Map数据库。
创建或打开数据存储(如果数据库文件不存在,则创建它,否则访问现有存储):
ChronicleMap<String, List<Point>> map = ChronicleMap
.of(String.class, (Class<List<Point>>) (Class) List.class)
.averageKey("range")
.averageValue(asList(of(0, 0), of(1, 1)))
.entries(10_000)
.createPersistedTo(myDatabaseFile);
然后,您可以使用创建的ChronicleMap
对象,就像使用简单的HashMap
一样,而不必担心键和值序列化。