为大数据实现java.util.Map

时间:2013-04-02 21:17:12

标签: java map implementation

我正在尝试实现一个支持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实现迭代器的策略是什么?

3 个答案:

答案 0 :(得分:0)

老实说看起来这样做是最好的方式,你也必须以这样的方式实现Set和Collection,它使用一种有效的方法来检索这些值,而不是试图将整个数据库拉入内存,并返回该已实现的Set或Collection接口的实例。

答案 1 :(得分:0)

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

StoredMap: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

答案 2 :(得分:0)

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