【问题标题】:Need to load 5 Million entries from hazelcast map to another map while startup of application启动应用程序时需要将 500 万个条目从 hazelcast 地图加载到另一个地图
【发布时间】:2017-11-13 11:38:07
【问题描述】:

我想将 500 万个条目从 hazelcast IMap 加载到另一张地图,但它花费了太多时间。我怎样才能优化它,所以它应该花费更少的时间,我的应用程序可以尽早出现。下面是代码 sn-p

    //localMap is another map where i want to put all entries from Hazelcast
    Map<Object, Object> localMap = new ConcurrentHashMap();
    //imap is hazelcast map reference
    Iterator<Object> itr = imap.keySet().iterator();
    while (itr.hasNext()) {
        Object obj = itr.next();
        localMap.put(obj, imap.get(obj));
    }
    //returning entry set of local map
    return localMap.entrySet().iterator();

【问题讨论】:

  • 并行化到五个线程,每个线程只复制一百万个条目?
  • 您不能在后台线程中初始化您的地图,以便您的应用程序可以更快地启动吗?
  • docs.hazelcast.org/docs/latest/javadoc/com/hazelcast/core/… 可以提供帮助。但总的来说,这看起来像是一个设计问题。与之前处理键的时间相比,如何确保在初始化逻辑完成时映射包含相同的值?
  • @Shark 感谢您的建议,但问题是我如何将它分成每个线程的 1M 条目?
  • @StephaneM 不,我不能,因为我有一些依赖于 localmap 的服务,它应该首先初始化。

标签: java hazelcast hazelcast-imap


【解决方案1】:

你可以这样做:

IMap map = hc.getMap("some-map");
Map result = map.getAll(map.keySet());

但这将是一项昂贵的操作。或运行 Predicate 来检索所有值,请参阅文档:http://docs.hazelcast.org/docs/3.9/manual/html-single/index.html#distributed-query

但这看起来确实是一个设计问题,因为您必须在应用程序 jvm 中容纳所有 500 万个条目 - 增加了内存占用。另外,不要忘记同时移动这些条目时的网络和 ser/des 开销。

如果您的用例是这样的,那么我建议您也将结果集分成小块,请参阅分页谓词文档了解更多详细信息:http://docs.hazelcast.org/docs/3.9/manual/html-single/index.html#filtering-with-paging-predicates

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    相关资源
    最近更新 更多