繁体   English   中英

添加到大型Java集合,性能瓶颈

[英]Adding to a large Java collection, performance bottleneck

我正在尝试将一百万个对象添加到列表中。 这样做的时间比我耐心等待的时间长。 随着每一步的进行,似乎也需要越来越长的时间。

    int size = 1000000;
    Deque<DatastoreElement> content = new LinkedList<DatastoreElement>();

    for (int i = 0; i < size; i++) {

        String k = Utils.getRandomStringOfLength(20);
        String v = Utils.getRandomStringOfLength(300); // goes faster with smaller number

        int metaHash = random.nextInt(10) + 1;
        KVPair kvp = new KVPair(k, v);
        DatastoreElement dse = new DatastoreElement(metaHash, kvp);

        content.addLast(dse); // confirmed problem is here

        if (i % 10000 == 0) {
            System.out.println(i);
        }
    }

我尝试将内容添加到ListSet具有非常相似的结果。 它会快速启动并在一些数字后扼流圈。

我应该使用什么样的集合来存储大量相似的元素? 我在这里想念一些简单的东西吗

这个问题不是一般的集合, 也不是如图所示的LinkedList (具有O(1)添加特性)。

因此可能的嫌疑人是内存的颠簸/交换。 确保JVM有足够的内存,系统有更多..

LinkedList切换到ArrayList (或ArrayDeque )将保持O(1) 分摊的性能,但每个项目的开销可能 略微减少。 (开销,如果这种减少甚至重要,取决于添加的对象的大小和后备存储的填充率。)

  • 已经建议使用ArrayList(在链表中,每个项/节点都暗示了一个附加对象)。
  • 另外(之前也建议),如果使用基于数组的集合,请尝试构造/调整大小到足够的长度。
  • 此外,如果内存是一个问题,您可能希望使用带有字符串元素String#intern()的Flyweight模式,因此可以收集冗余实例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM