【问题标题】:Implementing java.util.Map for big data为大数据实现 java.util.Map
【发布时间】:2013-04-02 21:17:12
【问题描述】:

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

【问题讨论】:

  • 您不是唯一需要内存高效地图的人,我不会重新发明轮子并自己发明。首先,尝试使用HashMap 之类的标准类型之一,然后如果您发现性能问题,请在某个库中查找实现。见stackoverflow.com/questions/3972127/…
  • 也就是说,除了如何将数据放入和取出之外,您已经弄清楚了? (首先,您必须确定数据库组织,然后制定缓存方案。最难的是知道何时需要搜索数据库以进行查找操作——您需要有某种方案来缓存数据库键值。 )
  • 您不必在内存中构建完整的集合,您只需提供遍历数据库的迭代器。

标签: java map implementation


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我推荐使用 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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2010-10-26
        • 2011-08-13
        • 2016-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-16
        • 2019-12-15
        相关资源
        最近更新 更多