【发布时间】:2012-10-16 01:55:03
【问题描述】:
我正在尝试将文本文件中的数据放入 HashMap。 文本文件的格式如下:
它有大约 700 万行...(大小:700MB)
所以我要做的是: 我读了每一行,然后我把绿色的字段连接成一个字符串 这将是 HashMap 键。值将是红色区域。
每次我读到一行时,我都必须检查 HashMap 是否已经有一个带有此类键的条目, 如果是这样,我只是更新值与红色相加; 如果没有,则向 HashMap 添加一个新条目。
我用 70.000 行的文本文件尝试了这个,效果很好。
但现在有了 700 万行文本文件,我遇到了“java 堆空间”问题,如图所示:
这是因为 HashMap 吗? 是否可以优化我的算法?
【问题讨论】:
-
要存储 700 MB 的文本,您将需要至少 1.4 GB 可能接近 3 GB 的开销和 HashMap。你有多少内存?
-
注意,你不需要先检查是否有条目,如果条目已经在
HashMap中,它将被替换为新的值。 -
我刚刚将我的 netbeans.conf 更改为 -J-Xms500M -J-XX:PermSize=1500M 我会尝试这样并检查一下...顺便说一下我有 4GB 的 RAM
-
所以我这样做了:-J-Xms600M -J-XX:PermSize=1600M...但仍然有堆溢出,如果我向 Xms 添加更多内容,Netbeans 将无法启动... :(
-
你需要这么多数据做什么?大数据的最佳管理方法是分段读取,并且只将相关的小部分存储在内存中。您可以创建一个 API 来仅读取大量数据中所需的一小部分,而将其余部分保存在磁盘中。您可以让 API 返回这些小部分的 HashMap,然后使用 HashMap。如果要读取和处理整个文件,请在文件部分重复从 API 请求 HashMap,从内存中丢弃已处理的部分。
标签: java hashmap text-files heap-memory