質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

18913閲覧

大量のデータの処理を行いたい(OutOfMemoryError)

kiramekiawa1

総合スコア8

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2018/07/26 09:35

まだ初めて3日のJava初心者です。

解析業務をしており、複数要素の結果を時刻歴で出力すしたデータが有ります。
その結果の値を使って計算したり抽出したりしようと思って、作成しました。
300MBぐらいのtxtデータだと問題なく動いたのですが、
500MBぐらいのtxtデータだと[OutOfMemoryError: Java heap space]のエラーに成ってしまいました。

内容としては下記のような形式で作成しました。(読み込みの部分だけですが)

String file1 = "sample.txt";
FileReader fr1 = new FileReader(file1);
BufferedReader br1 = new BufferedReader(fr1);
ArrayList <String> list1 = new ArrayList<String>();
String line1;
while((line1 = 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以上のものを扱う場合もあるので良い方法があれば教えて頂けると幸いです。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

◇デフォルトヒープサイズ
デフォルト・ヒープ・サイズ
サーバーVMかクライアントVMかはjava --versionで分かります。
今どきならサーバーVMかと。

◇VMオプションの変更
メリット:作成済みのコードを変更しなくてもよい。

Java

1ArrayList <String> list1 = new ArrayList<String>(); 2String line1; 3while((line1 = br1.readLine()) != null) { 4 list1.add(line1); 5}

他にも要因があると思いますが、
処理対象データをメモリに全部載せているのがOutOfMemoryErrorの1つの要因であるのであって。
必要なときに必要な分だけ抽出すれば、問題は発生しないかと。

以下からはコードを変更する事が前提の回答です。
案a, BufferedReader#lines()でファイル読み込み部分をストリーム化して一行ずつ処理をする。
メリットは必要なメモリが文字列1行分+α(状態変数分)
デメリットは1,途中の計算値を変数に保持する必要がある点。2,仕様変更に弱い。

案b, 計算したり抽出したりするのはデーターベース(DB)が得意な分野なので、DBに解析対象データを入れて、SQLで処理をする。(回答者が推す手法)
sqliteが導入しやすいかと。sqlite-jdbcライセンス条項


あと解析対象のファイルサイズが500MBだと検証/テストが大変なので、
指示者に確認するのが先決ですが、どうやって解析結果が正しいかの保証を行うのかを一度考えてみてくださいな。

投稿2018/07/26 11:38

編集2018/07/26 13:56
umyu

総合スコア5846

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

eclipse.iniは、Eclipseを動かすためのJava VMの設定を書くファイルだったと思います。
まずは、以下2点を試してみてはどうでしょうか。

  1. コマンドプロンプト(Windowsの場合)もしくはシェル(UNIX系の場合)から、「-Xmx 2048m」位を指定して実行してみる。
  2. Eclipse上で「プロジェクトのプロパティ→実行/デバッグ設定→'hogehoge'の起動構成→新規→VM設定」で、1.で動いた場合のヒープメモリサイズを設定する。

投稿2018/07/26 10:21

rtr1950x

総合スコア298

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問