2016-06-02 9 views
0

私はファイルを持っていて、ファイルからはHashMap<String, ArrayList<Objects>>を設定しています。 HashMapのサイズは25であることを意味しますが、25キーとなりますが、リストは各キーの膨大な数百万レコードになります。大きなファイル処理のためのメモリ使用量を最適化する方法

私が今使っているのは、各キーがレコードのリストを取得し、スレッドを使ってそれらを並列処理することです。大きなファイルに直面するまで状況は良かったので、 "java.lang.OutOfMemoryError:Java heap space"に直面しています。

代わりに、オブジェクトのリストでHashMapを埋め込む最良の方法は何ですか?私が考えているのは、ファイルの25のオフセットを取得し、ファイルから読み込んだ行をarrayListに格納するのではなく、ファイルのオフセットを入れて、各スレッドに開始オフセットから終了オフセットまで繰り返すイテレータを与えることです。私はまだこの考えを試さなければならない。しかし、私が実行する前に、メモリ使用量を最適化するためのより良い方法を知りたいと思います。あなたはそれをどうするか必要なんHashMapを移入した後

+0

-Xmxコマンドラインパラメータを使用してJVMにさらにメモリを割り当てないのはなぜですか? –

+0

ファイルは100GBもあり、このアプリケーションの複数の実行も頻繁に発生します。したがって、十分ではない可能性があり、同じメモリの問題になる可能性があります。 – Deepak

+0

あなたのオフセットのアプローチは良いようです。 OSレベルで並行性の問題があるかもしれませんが、私は大きなファイルを25の別々のファイルに分け、それぞれのスレッドでそれぞれを処理します。あなたのHashMapは

答えて

1

I will populate the HashMap<String, ArrayList<Objects>>

?私はマップを作成するだけであなたの仕事ではないと信じています。シナリオが何であれ、メモリ内のファイル全体を読む必要はありません。

ヒープサイズを増やすと、ヒープサイズよりもさらに大きなファイルを取得する可能性があります。

必要に応じてBufferedReaderまたはBufferedInputStreamを使用してチャンク内のファイルを読み取り、読んで作業します。 2つのAPIは、一度にメモリ内のファイルの一部だけを読み込みます。すべてのスレッドが同じJVMになりますので、複数のスレッドを使用して

I read from file into the arrayList, put the offset of the file and give each thread an iterator to iterate from its start offset to end offset. I still have to try this thought.

java.lang.OutOfMemoryErrorを防ぐことはできません。さらに、ファイルを1つのリストまたは複数のリストで読み込んでも、ファイルのすべてのデータが同じヒープメモリに読み込まれます。

ファイルからのデータで実際に何をしたいかを言えば、この回答はより具体的なものになります。

0

アトスが言ったこと。詳細が必要です。あなたは地図で何をしようとしていますか?ファイル全体をメモリにロードする必要がある操作ですか?それとも部分的に行うことができますか?

また、サイズがしきい値を超えたらファイルを分割することを検討しましたか?ここPshemoの答えのように

:あなたは並列に処理したい場合はHow to break a file into pieces using Java?

はまた、あなたは、ファイルの一部をカバーしてマップを処理して検討することができます。並行してマッピングし、結果をある種のキューに格納するプロセス。キューには処理中のデータのサブセットが含まれていれば(OutOfMemoryの例外を回避するため)。

+0

あなたは私の質問の下のコメントを読まなかったと思います。私はまた、私は巨大なオーバーヘッドのためにファイル分割をしないことに言及した。ありがとう。 – Deepak

+0

申し訳ありませんDeepak。当時は気づかなかった。あなたのオフセットアイデアは機能しましたか? –

+0

私はオフセットについても、スレッドはパラレルにIOファイルのパフォーマンス上の問題を持つオフセットを読み取るために同じファイルを開く必要があります。だから私はこれを解決するための生産者 - 消費者のアプローチを実装しました。 – Deepak

関連する問題