質問: br1.readLine()) != null) { list1.add(line1); } スペック プロセッサ:Intel(R)Xeon(R)CPU E3-1270 V2 @ 3.50GHz 実装メモリ:8.00GB システム:64bit ソフト:Eclipse Java EE IDE Version: Photon Release (4.8.0) eclipse.iniの-vmargsを変更したりしたのですが正解が良く分からず困っています。 業務上500MB以上のものを扱う場合もあるので良い方法があれば教えて頂けると幸いです。 よろしくお願いします。
回答: ◇デフォルトヒープサイズ デフォルト・ヒープ・サイズ サーバーVMかクライアントVMかは`java --version`で分かります。 今どきならサーバーVMかと。 ◇VMオプションの変更 メリット:作成済みのコードを変更しなくてもよい。 ``` ArrayList list1 = new ArrayList(); String line1; while((line1 = br1.readLine()) != null) { list1.add(line1); } ``` 他にも要因があると思いますが、 処理対象データをメモリに全部載せているのが`OutOfMemoryError`の1つの要因であるのであって。 必要なときに必要な分だけ抽出すれば、問題は発生しないかと。 以下からは**コードを変更する事が前提の回答**です。 案a, `BufferedReader#lines()`でファイル読み込み部分をストリーム化して一行ずつ処理をする。 メリットは必要なメモリが文字列1行分+α(状態変数分) デメリットは1,途中の計算値を変数に保持する必要がある点。2,仕様変更に弱い。 案b, 計算したり抽出したりするのはデーターベース(DB)が得意な分野なので、DBに解析対象データを入れて、`SQL`で処理をする。(回答者が推す手法) sqliteが導入しやすいかと。sqlite-jdbcとライセンス条項 あと解析対象のファイルサイズが500MBだと検証/テストが大変なので、 指示者に確認するのが先決ですが、どうやって解析結果が正しいかの保証を行うのかを一度考えてみてくださいな。