【发布时间】:2012-08-22 21:45:40
【问题描述】:
我正在尝试将一百万个对象添加到列表中。完成它所需的时间比我有耐心等待的时间长。似乎每一步都需要越来越长的时间。
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 添加内容,结果非常相似。它启动很快,然后在某个数字后窒息。
我应该使用什么集合来存储大量相似的元素?我在这里遗漏了一些简单的东西吗?
【问题讨论】:
-
尝试为 1,000,000 个元素预分配
ArrayList -
答案取决于您打算如何使用这些数据。除非您需要能够在两个方向上进行迭代,否则请使用
ArrayList而不是LinkedList。加载完数百万个对象后,您将如何处理它们? -
也许 JVM 正在破坏。尝试使用 -mx 增加内存限制
-
@Jam 我非常怀疑
adding 元素到ArrayList会导致严重的瓶颈。你确定瓶颈不在于制作对象本身吗? -
@Jam 为了将问题归结为特定调用,我建议您尝试使用适当的分析器来分析您的代码,例如 JDK 附带的 JVisualVM
标签: java performance collections