【发布时间】:2011-07-18 18:21:20
【问题描述】:
我有一个非常大的哈希映射(2+ 百万条目),它是通过读取 CSV 文件的内容创建的。一些信息:
- HashMap 将一个字符串键(小于 20 个字符)映射到一个字符串值(大约 50 个字符)。
- 这个 HashMap 的初始容量为 300 万,因此负载因子约为 0.66。
- HashMap 仅由单个操作使用,一旦该操作完成,我“clear()”它。 (虽然这种清除似乎并没有真正清除内存,但是否需要单独调用 System.gc()?)。
我的一个想法是将 HashMap 更改为 HashMap 并使用 String 的 hashCode 作为键,这最终会节省一些内存,但如果两个字符串具有相同的哈希码,则可能会出现冲突问题......如何这可能适用于长度少于 20 个字符的字符串吗?
还有其他人对在这里做什么有任何想法吗? CSV 文件本身只有 100 MB,但 java 最终为此 HashMap 使用了超过 600 MB 的内存。
谢谢!
【问题讨论】:
-
如何使用嵌入式数据库,例如 HSQLDB 或 SQLite。 hsqldb.orgsqlite.org
-
在需要唯一值的地方使用哈希码总是会带来麻烦。 “可能”不是问题:哈希码中根本没有足够的位来唯一地指定 20 个字符的字符串。
标签: java memory memory-management memory-leaks hashmap