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 バイトです。プロトコルは、おそらく 1 バイト以下で格納できます。

これは 13 バイトであり、UTF16 文字列として格納された 70 バイトではなく、キーのメモリを 5 分の 1 に減らします。この夜の計算が正しければ...

于 2012-10-25T21:54:18.347 に答える