Java是否有(或者是否有可用的库)允许我拥有基于磁盘的HashMap?它不需要是原子或任何东西,但它将通过多个线程访问,如果两个同时访问同一个元素,则不应该崩溃。
任何人都知道什么?
答案 0 :(得分:30)
<强>创建mapdb 强>
MapDB提供由磁盘存储或堆外内存支持的并发TreeMap和HashMap。它是一个快速,可扩展且易于使用的嵌入式Java数据库引擎。它具有诸如事务,节省空间的序列化,实例缓存和透明压缩/加密等功能。它还具有与本机嵌入式数据库引擎相媲美的出色性能。
<强> jdbm2 强>
嵌入式键值Java数据库。
答案 1 :(得分:11)
properties files或Berkeley DB可能是您正在寻找的。 java.util.Properties
本身实现了java.util.Map
,并提供了load
和store
到文件的方法。 Berkeley DB通常被推荐为轻量级键值对数据存储区。
答案 2 :(得分:7)
听起来你需要一些接近轻量级数据库的东西。你看过/考虑Java DB?一个带有单个索引表的轻型数据库基本上是一个基于磁盘的线程安全哈希映射。
答案 3 :(得分:7)
JDBM2正是您的要求。它提供了由磁盘存储(以及其他映射)备份的HashMap。它的快速,线程安全和API非常简单。
答案 4 :(得分:4)
Project Voldemort也是一个非常快/可扩展/复制的“Hashmap”。它在LinkedIn使用,表现也相当不错:
他们网站的引用:
以下是我们从a中看到的吞吐量 单个多线程客户端交谈 单个服务器所在的“热门”数据 集合在人工记忆中 我们的性能实验室负载很重:
读取:19,384 req / sec
写道:16,559 req / sec
答案 5 :(得分:4)
Chronicle Map实现f = open('thesis.txt', 'w')
while True:
x=input("\n\nhave you found your final individual (y/n)?")
if x=='y':
final=int(input("Which individual is your final one?"))
print("your final individual is a dictionary as follows:")
print(population[final-1])
break;
elif x=='n':
print("\nto continue you need to select 2 of your favorie designs.\n")
report=[0,0]
report[0]=int(input("the number of your first favorite design?"))
report[1]=int(input("the number of your second favorite design?"))
population=step(population,report)
f.write(str(population))
print("please copy and paste the following population in grasshopper.\n")
print(population)
并通过将数据映射到文件来将数据保存到磁盘。
Chronicle Map在概念上与MapDB非常相似(提供类似的构建器API和55 55 55 55 1 23 45
接口),但Chronicle Map比MapDB times faster并且具有更好的并发性(Chronicle Map使用高度条带化的多层次)旋转锁。)
答案 6 :(得分:2)
所以现在是2016年。如果有人想要解决这个问题,我发现JetBrains的Xodus中的低级环境API适用于同一目的,使用他们的{{存储lambdas。
当然,它并不像拥有纯computeInTransaction
实例那样光滑,但它适用于我的用例。
另一个最近的选择是使用H2's MVStore
storage engine做同样的事情,但我认为它更适合数据库本身。
干杯!
答案 7 :(得分:2)
在 PriceDate nchar(10) , Food_1_Price int, Food_2_Price int... Food_N_Price int
中,最轻的持久性2018
存储是H2 Database with it's MVStore:
MVStore是一个持久的,日志结构化的键值存储。它是 计划成为H2的下一个存储子系统,但也可以是 直接在应用程序中使用,而无需使用JDBC或SQL。
MVStore代表“多版本存储”。
每个存储区都包含许多可以使用java.util.Map接口访问的地图。
同时支持基于文件的持久性和内存中操作。
它旨在快速,易于使用且体积小。
支持并发读写操作。
支持事务(包括并发事务和两阶段提交)。
该工具非常模块化。它支持可插拔数据类型和序列化,可插拔存储(到文件,到堆外内存),可插拔映射实现(当前为B树,R树,并发B树),BLOB存储以及文件系统抽象到支持加密文件和zip文件。
key value
也包含在H2
我还看着:
1.8 meg
依赖项)13 meg
依赖项-快速有选择地分布)5.5 meg
Java依赖项+ 2 meg
C库)-最快的实现方式,但不是lmdb
开箱即用。