3

有没有一种简单的方法来获得文件支持的地图?

地图的内容会定期更新,有些会被删除,有些会被添加。为了保证地图中的数据安全,需要持久性。我知道数据库是理想的,但遗憾的是由于限制,无法使用数据库。

我努力了:

每次更新时将地图的全部内容写入文件。这行得通,但显然有一个缺点,即每次都重写整个文件,映射的内容预计从几个条目到 ~2000 不等。还有一些并发问题(即乱写导致数据丢失)。

使用RandomAccessFile并保留指向每个文件起始字节的指针,以便可以使用 seek() 查找每个条目。同样,这与以前有类似的问题,更改条目将涉及更新其之后的所有引用。

理想情况下,该解决方案将涉及某种缓存,以便仅将最近访问的条目保留在内存中。

有这样的事吗?还是可以通过第三方 jar 获得?有人建议使用 Oracle Coherence,但我似乎找不到太多关于如何实现它的信息,这似乎有点像用大锤敲碎坚果。

4

3 回答 3

2

您可以查看基于此目的创建的MapDB 。

MapDB 提供由磁盘存储或堆外内存支持的并发 Map、Set 和 Queue。它是一个快速且易于使用的嵌入式 Java 数据库引擎。

于 2013-07-06T21:27:50.377 回答
1

是的,Oracle Coherence 可以完成所有这些工作,但如果您只做这些,可能就有点过头了。

一种方法是从 RAM“溢出”到磁盘:

    BinaryStore diskstore = new BerkeleyDBBinaryStore("mydb", ...);
    SimpleSerializationMap mapDisk = SimpleSerializationMap(diskstore);
    LocalCache mapRAM = new LocalCache(100 * 1024 * 1024); // 100MB in RAM
    OverflowMap cache = new OverflowMap(mapRAM, mapDisk);

从版本 3.7 开始,您还可以透明地从 RAM 日志溢出到闪存日志。虽然您可以在代码中配置它(如上所述),但它通常只是一两行配置,然后您要求代表您配置缓存,例如

    // simplest example; you'd probably use a builder pattern or a configurable cache factory
    NamedCache cache = CacheFactory.getCache("mycache");

有关详细信息,请参阅http://coherence.oracle.com/提供的文档

为了全面披露,我在 Oracle 工作。这篇文章中表达的观点和观点是我自己的,并不一定反映我雇主的观点或观点。

于 2013-08-13T04:24:03.947 回答
1

jdbm2看起来很有前途,从未使用过,但它似乎可以满足您的要求:

JDBM2 提供了由磁盘存储支持的 HashMap 和 TreeMap。这是持久化数据的一种非常简单快捷的方法。JDBM2 还具有最低的硬件要求并且高度可嵌入(jar 只有 145 KB)。

如果您寻找键/值存储,您会发现更多解决方案。

于 2013-07-06T21:37:45.197 回答