【发布时间】:2021-12-25 01:34:26
【问题描述】:
我正在将一个包含大约 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)
【问题讨论】:
-
A
HashSet通常有 32 字节/元素的开销,对于初学者来说...... -
什么版本的Java?使用 Java 9 或更高版本可能会cut in half 用于表示您的文本的内存量。
-
@BasilBourque 我正在使用 Java 11