お世話になっております。
現在javaにて大容量のテキストファイル(100M以上)を読み込んで、
特定の文字が含まれている行のみを別ファイルへ抽出するという
プログラムを作成しています。
現在のロジックでは、
File file = new File( "読み込みファイル" );
byte[] b = new byte[ (int) file.length() ];
FileInputStream fis = new FileInputStream(file);
fis.read(b);
String str = new String(b, "Shift-JIS");
return str;
上記の様なのようなロジックのメソッドを作成し、
返り値の文字列を改行コードでsplitし、パターンマッチングして行を抽出する方法をとっています。
しかしこの方法だと、OutOfMemoryErrorが発生していまい、
30MB以上のファイルを読み込むことができません。
原因がJVMのメモリ領域の問題なのは理解していますが、
readLineをでためしてみると処理終了があまりにも遅すぎるため、
なるべく現在の手法を改良する方向で作成したいのですが、
一回目 :0 ~ 30000000byte まで
二回目 :30000001 ~ 60000000byte まで
の様にJVMの設定はいじらない方法でファイルのデータを、
指定バイトから指定バイトまで読み込む方法等なないでしょうか?
それ以外でも処理が早く、
大容量のテキストファイルを読み込む方法がありましたら、
そちらでも問題ありません。
ぜひとも知恵をお貸しください。
宜しくお願いします。
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)を繰り返す
ありがとうございます。
BufferedInputStreamは使用していなかったのですが、
解答いただいた方法を自分なりに改変することで、
うまく実行することが出来ました。
ちなみにBufferedReaderのreadLineを使用していたのですが、
splitでループを回した時と処理終了が断然違っていたのは、
自分なりに調べてみることにします。
No.1
- 回答日時:
マニュアルを読みましょう
http://java.sun.com/javase/ja/6/docs/ja/api/java …[])
『最大 b.length バイトまでのデータを』、この入力ストリームからバイト配列に読み込みます
http://java.sun.com/javase/ja/6/docs/ja/api/java …[],%20int,%20int)
『最大 len バイトまでのデータを』、この入力ストリームからバイト配列に読み込みます。
ただし。
複数バイト文字の途中まで/途中から読む可能性があります。
すなおにreadLine使うのがいいと思うのですが。
100Mのデータはそもそも読めてないわけですから、「readが早い」というのも100M全部では比較できてないんですよね?
あとは、exec("grep '検索文字列' ファイル > 出力ファイル"); とか
書き方が悪かったようで、すいません。
実際にファイル自体は読み込めているのですが、
String str = new String(b, "Shift-JIS");
の時点でoutOfMemoryが発生するという意味でした。
基本はやはりreadLineを使用するのですね。
なぜsplitとreadLineの終了時間に大きく差異が発生したのか、
自分なりに調べて見ることにします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- C言語・C++・C# C# で、あるフォルダー内にあるすべてのテキストファイルを別のフォルダーにコピーする。 4 2022/11/21 13:23
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
ファイル読み込み/書き込み速度を上げるには
Java
-
CSVファイルの特定の行だけを読み込みたいです。
Java
-
大容量のテキストファイルの内容を解析について
Java
-
-
4
IOException ってどういうときに起こるのでしょうか?
Java
-
5
javaで大量のファイルを読み込む方法
Java
-
6
JavaでCSVファイルを高速に読む方法
Java
-
7
ファイル内の1行(レコード)から指定バイト数だけを読込みたい。
Java
-
8
バイナリファイルでOutOfMemoryエラー
Java
-
9
JDBCでの大量データ検索でResultsetの戻りが遅い
Java
-
10
javaで、、、
Java
-
11
ArrayListの要素数の上限
Java
-
12
javaのCSVデータ読込についてです
Java
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
『args[]』とは?
-
[Ljava.lang.Stringってなんですか
-
javaについて
-
n番目に大きな値を探索する
-
この警告はどうすれば?
-
javaでEUC-JP文字列→UTF-8への変換
-
配列の中に複数存在する数がい...
-
配列について
-
配列で、値の入っている要素数...
-
配列をセッションに割り当てた後で
-
【C#】ハッシュテーブル(連想...
-
セッションを使ったint型の値の...
-
main(String[] args) の args...
-
java
-
Javaで文字と数字が混ざったも...
-
無名配列の作成方法について質問
-
多次元配列はなぜ必要???
-
2次元の配列となっているクラ...
-
JSPでデータ一覧表示
-
C++で、Excelの内容を取得する...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
[Ljava.lang.Stringってなんですか
-
この警告はどうすれば?
-
C#で動的配列Listの中身をListB...
-
javaで大容量テキストファイル...
-
C言語でunsigned char配列を連...
-
n番目に大きな値を探索する
-
JavaのBase64デコードで正しく...
-
配列で、値の入っている要素数...
-
Javaで文字を漢字であるか否か...
-
配列の中に複数存在する数がい...
-
データベースから取得したデー...
-
【C#】ハッシュテーブル(連想...
-
Javaで文字と数字が混ざったも...
-
cloneメソッドについて (java)
-
ArrayListからBean配列に値をセ...
-
配列をセッションに割り当てた後で
-
int配列をbyte配列に変換
-
セッションを使ったint型の値の...
-
javamailで複数人にメールを送...
-
【Ajax通信&Java】配列の受け取...
おすすめ情報