7

我正在尝试将一百万个对象添加到列表中。完成它所需的时间比我有耐心等待的时间长。似乎每一步都需要越来越长的时间来进行。

    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结果非常相似。它快速启动并在某个数字后窒息。

我应该使用什么集合来存储大量类似的元素?我在这里错过了一些简单的东西吗?

4

2 回答 2

11

这个问题通常与集合无关,与LinkedList所示的(具有O(1)附加特征)无关。

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

LinkedList从to ArrayList(or )切换ArrayDeque将保持O(1) 摊销性能,但每个项目的开销可能稍少。(开销,以及这种减少是否重要,取决于添加的对象的大小和后备存储的填充率。)

于 2012-08-22T21:58:40.523 回答
1
  • ArrayList 已经被建议(在链表中,每个项目/节点都意味着一个附加对象)。
  • 另外(以前也建议过),如果您使用基于数组的集合,请尝试将其构造/调整为足够的长度。
  • 此外,如果内存是一个问题,您可能希望将享元模式与字符串元素一起使用String#intern(),这样可以收集冗余实例。
于 2012-08-22T22:10:59.960 回答