我在这里与社区联系,了解是否有办法在Java地图结构中存储许多对象(> 500K)。我知道,如果我使用Java Collections API并且我正在寻找其他解决方案(在分布式缓存之外),我的应用程序将在某些时候超出其内存占用。我的目的是将某些内容存储到Map< String,List< String>>的效果中。
要求:
有没有人知道我可以使用的这样一个库可以实现这一点,或者有没有人遇到过他们需要在Java中加载内存中的许多对象的解决方案?我非常有兴趣听取您的反馈意见。
感谢。
答案 0 :(得分:10)
EhCache对此非常完美。从最基本的角度来看,它提供了一个键值映射,可选的溢出到磁盘,以及JVM重启的可选持久性。它会将元素保留在最常用的内存中。
答案 1 :(得分:1)
我和斯卡弗曼在一起。除了溢出到磁盘之外,EhCache还允许您将缓存放在进程中但是在堆外。如果您的缓存非常,那么这可能会对性能产生非常积极的影响,因为它可以减轻GC上的压力。
但必须支付此特定功能,否则EhCache是免费的。
Java中还有一些其他缓存,而不是EhCache,提供类似或有时甚至更高级的选项,如Infinispan或OsCache。
答案 2 :(得分:1)
您是否考虑过只读数据库,例如java cdb:http://www.strangegizmo.com/products/sg-cdb/
答案 3 :(得分:0)
虽然我还没有尝试过,但是H2 Database Engine除了提供关系数据库引擎之外,还提供了专门的键值存储。该商店称为MVStore。文档由H2内部使用,但建议您直接将其用于键值存储。
MVStore使您可以通过java.util.Map
界面进行交互,而无需使用JDBC或SQL。
用法示例,取自文档:
import org.h2.mvstore.*;
// open the store (in-memory if fileName is null)
MVStore s = MVStore.open(fileName);
// create/get the map named "data"
MVMap<Integer, String> map = s.openMap("data");
// add and read some data
map.put(1, "Hello World");
System.out.println(map.get(1));
// close the store (this will persist changes)
s.close();
阅读the thorough documentation,了解其性能概况,并发性以及在持久存储的同时缓存内存的能力。