我正在尝试将一百万个对象添加到列表中。这样做所需的时间比我耐心等待的时间要长。进行每一步似乎也需要越来越长的时间。
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);
}
}
我尝试将内容添加到 List
、Set
,结果非常相似。它启动很快,并在一些数字后窒息。
我应该使用什么集合来存储大量相似的元素?我在这里遗漏了一些简单的东西吗?
最佳答案
这个问题一般不会出现在集合中,不会出现在 LinkedList
中(具有 O(1)
添加特性) .
因此,可能的嫌疑人正在抖动/交换内存。 确保JVM有足够的内存,系统有更多..
从 LinkedList
切换到 ArrayList
(或 ArrayDeque
)将保持 O(1)
摊销 性能,但可能每个项目的开销略微。 (开销,以及这种减少是否重要,取决于添加的对象的大小和后备存储的填充率。)
关于java - 添加到大型 Java 集合,性能瓶颈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12081867/