[英]Why is HashSet in Java taking so much memory?
我正在将一个大约有 3800 万行的 1GB ASCII 文本文件加载到 HashSet 中。 使用 Java 11,该过程需要大约 8GB 的内存。
HashSet<String> addresses = new HashSet<>(38741847);
try (Stream<String> lines = Files.lines(Paths.get("test.txt"), Charset.defaultCharset())) {
lines.forEach(addresses::add);
}
System.out.println(addresses.size());
Thread.sleep(100000);
为什么 Java 占用这么多内存?
相比之下,我在 Python 中实现了同样的事情,它只需要 4GB 的内存。
s = set()
with open("test.txt") as file:
for line in file:
s.add(line)
print(len(s))
time.sleep(1000)
HashSet
的负载因子默认为 0.75。 这意味着一旦哈希集已满 75%,就会重新分配内存。 如果您的哈希集应该包含 38741847 个元素,则必须使用 38741847/0.75 对其进行初始化或设置更高的负载因子:
new HashSet<>(38741847, 1); // load factor 1 (100%)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.