• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:javaで大容量テキストファイルの読み込みについて)

Javaで大容量テキストファイルの読み込みについて

このQ&Aのポイント
  • Javaで大容量のテキストファイルを読み込み、特定の文字が含まれている行のみを抽出するプログラムの作成方法について教えてください。
  • 現在の方法ではOutOfMemoryErrorが発生し、30MB以上のファイルを読み込むことができません。改良方法や他の高速な読み込み方法があれば教えてください。
  • または、指定したバイト範囲でテキストファイルを読み込む方法も知りたいです。どうぞよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • salsberry
  • ベストアンサー率69% (495/711)
回答No.2

readLine()を試したということですが、どのクラスのreadLine()を使ったのでしょう? BufferedReaderでも遅かったのでしょうか? FileInputStreamで頑張る場合でもそのまま使うのではなくてBufferedInputStreamをかぶせましょう。 (a) 1行の長さより十分長い(たとえば8KB)byteの配列を用意する (b) そのbyte配列にBufferedInputStreamから8KB分のデータを読み込む (c) byte配列の中を自力で行を区切って処理する (split()は使えません) (d) byte配列の最後に1行に満たないデータがnバイト分残った場合は、そのnバイトをbyte配列の先頭へコピーする (e) byte配列の(n+1)バイト目以降に、続きのデータを(8K-n)バイト分だけBufferedInputStreamから読み込む (read(byte[], int, int)が使えます) (f) ファイルの最後を読み込むまで(c)~(e)を繰り返す

heka_11
質問者

お礼

ありがとうございます。 BufferedInputStreamは使用していなかったのですが、 解答いただいた方法を自分なりに改変することで、 うまく実行することが出来ました。 ちなみにBufferedReaderのreadLineを使用していたのですが、 splitでループを回した時と処理終了が断然違っていたのは、 自分なりに調べてみることにします。

その他の回答 (1)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

マニュアルを読みましょう http://java.sun.com/javase/ja/6/docs/ja/api/java/io/FileInputStream.html#read(byte[]) 『最大 b.length バイトまでのデータを』、この入力ストリームからバイト配列に読み込みます http://java.sun.com/javase/ja/6/docs/ja/api/java/io/FileInputStream.html#read(byte[],%20int,%20int) 『最大 len バイトまでのデータを』、この入力ストリームからバイト配列に読み込みます。 ただし。 複数バイト文字の途中まで/途中から読む可能性があります。 すなおにreadLine使うのがいいと思うのですが。 100Mのデータはそもそも読めてないわけですから、「readが早い」というのも100M全部では比較できてないんですよね? あとは、exec("grep '検索文字列' ファイル > 出力ファイル"); とか

heka_11
質問者

お礼

書き方が悪かったようで、すいません。 実際にファイル自体は読み込めているのですが、 String str = new String(b, "Shift-JIS"); の時点でoutOfMemoryが発生するという意味でした。 基本はやはりreadLineを使用するのですね。 なぜsplitとreadLineの終了時間に大きく差異が発生したのか、 自分なりに調べて見ることにします。

専門家に質問してみよう