【发布时间】:2014-07-30 12:54:24
【问题描述】:
我是 Java 新手,如果我做错了什么,请原谅我。
我正在开展一个项目,我需要快速扫描大量数据(包含 5000 万行或更多行的 CSV,每行 5 个条目)以进行重复。我使用了HashMap,因为它的.contains() 方法很快。
但是,我最终不得不在地图中存储一百万个或更多键。每个键都与一个 int[] 数组相关联,该数组也有 1 到 100 个条目。很明显,除非我使用的笔记本电脑内存约为 16 GB,否则我最终会收到 OutOfMemory 错误。
我在想,一旦HashMap 获得超过 N 个键或一个键获得超过 N 个条目,我可以将它写在某处并清除它。但是,并不是所有的键或值都可以一次找到,所以我需要能够添加到写入的 hashmap 中,而不是覆盖它。
我已经搜索了很多地方,但仍然找不到方法,所以非常感谢任何可以提供帮助的人!
【问题讨论】:
-
如果这些行有一些识别属性,那么你可以只存储那个,而不是整行。或者可能从该行创建一个哈希码,并且只有当您发现潜在的冲突时,才将这些哈希存储到另一个列表并进行第二次迭代以查看具有相同哈希码的条目是否真正相同。
-
尝试在“java”命令中指定-Xmx3G(或-Xmx4G,-Xmx5G,...)。您需要尝试增加堆大小。 Hashmap 可以保存非常大的数据。
-
@tobias_k 谢谢,我会尝试迭代两次!
-
@DmitryTsechoev 也感谢 xD 我正在使用 -Xmx14g 运行它,所以我觉得这有点荒谬
-
@larrienea,不客气!
标签: java duplicates out-of-memory