【发布时间】:2015-01-06 10:43:46
【问题描述】:
我需要将大约 2000 万个条目放入 HashMap。我选择了 TLongObjectHashMap 为:Why is Java HashMap slowing down?
代码如下:
StringBuilder sb = new StringBuilder("");
StringBuilder value = new StringBuilder("");
TLongObjectHashMap<String> map = new TLongObjectHashMap<String>();
in = new FileInputStream(new File(inputFile));
br = new BufferedReader(new InputStreamReader(in), 102400);
for (String inLine; (inLine = br.readLine()) != null;) {
sb.setLength(0);
for (i = 0; i < 2; i++) {
for (j = 1; j < 12; j++) {
sb.append(record.charAt(j));
}
}
for (k = 2; k < 4; k++) {
value.append(record.charAt(k));
}
for (k = 7; k < 11; k++) {
value.append(record.charAt(k));
}
map.put(Long.parseLong(sb.toString()), value.toString());
value.delete(0, value.length());
}
我使用了 GNU Trove。尽管如此,它还是变得非常缓慢,几乎停止在大约 1500 万个条目上。目前还没有 OutOfMemoryError。有什么问题?
我没有选择为此使用 DB。
注意:像 1、12、2,4 等的值在此循环之前计算并存储在一个变量中,该变量将在此处使用。我现在只是用一些值替换了它们
【问题讨论】:
-
运行它的 JVM 的最大堆大小是多少?
-
您是否尝试过开启 GC 跟踪以查看在 GC 中花费了多少时间?
value变量(StringBuilder)的用途是什么? -
2000 万个条目可能正在突破极限,您是否考虑过外部存储,例如数据库?
-
那不是 GC 跟踪。这只是将 VM 的最大堆设置为 512M,我怀疑这还不够。使用
-Xloggc:gc.txt登录到文件。 -
当然可以,但是你可以猜猜,如果你是推2000万次,初始容量可以设置在2000000左右。这会在每次插入数据之前预先分配。在我看来,这将减少性能问题。
标签: java dictionary