2

我正在尝试实现一个数据库支持java.util.Map,像 put 和 get 之类的大部分接口都很容易实现,但是我在找出实现的最佳方法时遇到了麻烦:

    @Override
    public Set<K> keySet() {
          // TODO Auto-generated method stub
           return null;
    }

    @Override
    public Collection<V> values() {
         // TODO Auto-generated method stub
         return null;
    }

    @Override
         public Set<Map.Entry<K, V>> entrySet() {
        // TODO Auto-generated method stub
        return null;
    } 

我担心的是键和值可能数以百万计的记录。因此,当访问这些方法时,我认为它的内存和 cpu 无法有效地获取和存储所有“键”或“值”。

有哪些选项可以实现内存有效的方式来实现这些?

为 entrySet 实现迭代器的策略是什么?

4

3 回答 3

0

我推荐使用 Oracle 的 BerkeleyDB Java 版。com.sleepycat.collections.StoredContainer.StoredMap 类实现了 java.util.Map 接口,还将数据备份到磁盘。我用它来处理大约 8GB 数据的地图。

存储地图: http ://docs.oracle.com/cd/E17277_02/html/java/com/sleepycat/collections/StoredMap.html

BerkeleyDB Java 版:http ://www.oracle.com/technetwork/database/berkeleydb/overview/index-093405.html

于 2013-04-02T23:13:27.767 回答
0

老实说,看起来尽可能以最好的方式做到这一点,您还必须以这样一种方式实现 Set 和 Collection ,即它使用一种有效的方法来检索这些值,并且不会尝试将整个数据库拉入内存,并返回一个实现的 Set 或 Collection 接口的实例。

于 2013-04-02T22:43:37.223 回答
0

如果总数据量很大(千兆字节),则可能值得将数据移出堆,以避免长时间的 GC 暂停。作为一个真实的例子,请参阅这篇文章:Going off-heap to increase latency and reduce AWS bill

于 2017-03-18T22:31:44.250 回答