我正在尝试将文本文件中的数据导入HashMap。 文本文件具有以下格式:
它有700万行...(大小:700MB)
所以我做的是: 我读了每一行,然后我把字段变成绿色并将它们连接成一个字符串 这将是HashMap的关键。价值将是红色的fild。
每当我读到一行时,如果已经有一个带有这样键的条目,我必须在HashMap中查看, 如果是这样,我只是用红色更新值的总和; 如果没有,则将新条目添加到HashMap中。
我尝试使用70.000行的文本文件,效果很好。
但是现在有了7百万行文本文件,我得到了一个“java堆空间”问题,就像在图像中一样:
这是由于HashMap吗? 是否可以优化我的算法?
答案 0 :(得分:3)
您应该增加堆空间
-Xms<size> set initial Java heap size
-Xmx<size> set maximum Java heap size
java -Xms1024m -Xmx2048m
很好的阅读From Java code to Java heap
Table 3. Attributes of a HashMap
Default capacity 16 entries
Empty size 128 bytes
Overhead 64 bytes plus 36 bytes per entry
Overhead for a 10K collection ~ 360K
Search/insert/delete performance O(1) — Time taken is constant time, regardless of the number of elements (assuming no hash collisions)
如果您认为7 Million
记录的上表开销约为246 MB
,那么您的最小堆大小必须在1000 MB
附近
答案 1 :(得分:1)
除了更改堆大小外,还可以考虑通过将密钥存储为压缩二进制而不是String来“压缩”(编码)密钥。
每个IP地址可以存储为4个字节。端口号(如果它们是什么)每个是2个字节。该协议可能存储为一个字节或更少。
那是13个字节,而不是70个存储为UTF16字符串,如果我的数学在晚上的时间是正确的话,将密钥的内存减少5倍......