7

リストに100万個のオブジェクトを追加しようとしています。それをするのにかかる時間は、私が待つ忍耐力よりも長いです。また、各ステップを実行するのに徐々に時間がかかるようです。

    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からArrayList(または)に切り替えると、償却パフォーマンスArrayDequeは維持されますが、アイテムあたりのオーバーヘッドがわずかに少なくなる可能性があります。(オーバーヘッド、およびそのような削減が重要である場合でも、追加されるオブジェクトのサイズとバッキングストアの充填率によって異なります。)O(1)

于 2012-08-22T21:58:40.523 に答える
1
  • ArrayListはすでに提案されています(リンクリストでは、各アイテム/ノードは追加のオブジェクトを意味します)。
  • また(以前にも提案されていました)、配列ベースのコレクションを使用する場合は、適切な長さに構築/サイズ変更してみてください。
  • また、メモリが問題になる場合は、文字列要素String#intern()でFlyweightパターンを使用して、冗長なインスタンスを収集できるようにすることもできます。
于 2012-08-22T22:10:59.960 に答える