1

我正在尝试将文本文件中的数据获取到 HashMap 中。文本文件具有以下格式:

在此处输入图像描述

它有700万行......(大小:700MB)

所以我要做的是:我阅读每一行,然后我将字段用绿色连接起来,并将它们连接成一个字符串,该字符串将作为 HashMap 键。值将是红色区域。

每次我读到一行时,我都必须检查 HashMap 是否已经有一个带有这样的键的条目,如果是这样,我只需更新值,将值与红色相加;如果不是,则将新条目添加到 HashMap。

我用 70.000 行的文本文件尝试了这个,效果很好。

但是现在有了 700 万行文本文件,我得到了一个“java 堆空间”问题,如图所示:

在此处输入图像描述

这是由于 HashMap 吗?是否可以优化我的算法?

4

2 回答 2

3

你应该增加你的堆空间

-Xms<size>        set initial Java heap size
-Xmx<size>        set maximum Java heap size

java -Xms1024m -Xmx2048m

从 Java 代码到 Java 堆的好读物

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

于 2012-10-25T19:51:43.883 回答
1

除了更改堆大小之外,还可以考虑通过将密钥存储为打包二进制而不是字符串来“压缩”(编码)密钥。

每个 IP 地址可以存储为 4 个字节。端口号(如果是这样的话)每个是 2 个字节。该协议可能可以存储为一个字节或更少。

那是 13 个字节,而不是存储为 UTF16 字符串的 70 个字节,如果我的数学在晚上这个时候是正确的,那么键的内存减少了 5 倍……

于 2012-10-25T21:54:18.347 回答