
10000行1GBほどの大容量のテキストファイルの内容を解析しようとしています。
このテキストファイルは約20行で一塊のデータが入っており、次の20行からまた一塊のデータがはいっています。現在、全行を1行ごとにArrayListに格納してから 各行にキーワードが含まれていないかチェックし、含まれていたらそのデータの塊の中にある2行目を行を出力しようとしています。
しかし、10000行のArrayListを宣言しようとしたところ、途中でOutOfMemoryになり、メモリ不足になります。そこで、最初の20行を読み込み、処理をし、次の20行を読み込み処理をする・・・と考えているのですが、このようなことをJAVAのソースコードで実現することは可能でしょうか??
皆さんは大容量ファイルを解析するときにどのような手法をとっていますか?
ご教示いただければ幸いです。
No.6ベストアンサー
- 回答日時:
そもそもListに入れる必要が無いと思います。
・2行目は覚えておく
・"区切りキーワード"を見つけるまで、1行ずつキーワードが含まれているかチェックする。
・"区切りキーワード"を見つけるか、最後まで読み込んだ時に、直前のブロックにキーワードが
含まれていたら、覚えておいた2行目を出力する。
String secondLine = "2行目が無かった";
String line = br.readLine();
while (line != null) { // 全体が終わるまでループ
it cnt = 1; // 処理行数(ブロック内の)
boolean isFound = false; // キーワード発見フラグ
while (line != null) { // 全体が終わるまでループ(区切りキーワードが見つかったらbreak))
if (line.contains(Sep)) {
break; // 区切りキーワード発見
}
if (cnt == 2) {
secondLine = line; // 出力用の2行目を退避
}
if (!isFound && line.contains(keyword)) {
isFound = true; // キーワード発見
}
line = br.readLine(); // 次行読み込み
cnt++;
}
if (isFound) {
System.out,println(secondLine);
secondLine = "2行目が無かった";
}
}
なるほど!Listに入れなくてはいけないというのは自分の固定観念でした!
たしかにそもそもListに入れる必要はなさそうですね!
ありがとうございます。
ベストアンサーとして選ばさせていただきます。
No.3
- 回答日時:
ぱっと考えつくのは
BufferedReader in = getReader();
List<String> lines = new ArrayList<String>();
String line;
System.out.println("----------------------");
while (in.ready()) {
line = in.readLine();
lines.add(line);
if (lines.size() == 3) {
for (String l : lines) {
if (l.indexOf("15") >= 0) {
System.out.println(lines.get(1));
}
}
lines.clear();
}
}
System.out.println("----------------------");
だがこれも OutOfMemory でるから。
http://java.sun.com/javase/ja/6/docs/ja/api/java …
利用したら? 2GBの壁にきをつければ。。。
No.1
- 回答日時:
そりゃぁ「最初の20行を読み込み、処理をし、次の20行を読み込み処理をする」のは可能です.
とりあえず「最初の 20行を読み込む」ところだけ書いてみてください.
この回答への補足
補足します。実際のデータは必ず20行が約束されているわけではありませんが、30行までにはひとつのデータの塊が収まることがわかっています。そして、データとデータの境には”区切りキーワード”が必ずあることがわかっています。 そこで以下のように最初の30行を”区切りキーワード”が来るまでArrayListに格納し、処理をするところのプログラムです。
ここから先が不明なのは
1.前回読み込んだ行までを覚えて、
2.その行をスタート位置とし、
3.そこから次の30行を読み、同じ処理を繰り返す。
の部分です・・・・。
public static void main(String[] args){
ArrayList<String> copy=new ArrayList<String>();//1行ずつ格納
String Sep = "区切りキーワード";//30行以内には必ず1回はこの区切りキーワードが来ます。
try {
br = new BufferedReader(new InputStreamReader
(new FileInputStream("C:\\sample\test.txt"), "Shift_JIS"));
while(i<30){ //”区切りキーワードが来るまでループ”
line= br.readLine();
copy.add(i, line);
i++;
if(line.contains(Sep)){
break;
}
}
for(int k=0;k<copy.size();k++){ //Arraylistに収めた中で処理をする(キーワード検索)
if(copy.get(k).contains(" キーワード ")){
//キーワードが見つかったときに、ここに処理を書く。
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- Perl Perlで特定文字列から特定文字列までを抜き出したい 4 2022/04/02 14:24
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/21 09:42
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- 宇宙科学・天文学・天気 AIが答えた方程式 1 2023/02/20 00:12
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
- UNIX・Linux VirtualBox ゲストOSにPC内蔵HDDのパーティションをマウントする方法は? 2 2023/05/06 22:52
- 統計学 ダミー変数の因子分析について質問です 1 2022/03/27 14:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
System.err. printlnとSystem.o...
-
Log4jで機能毎に別ファイルへ出...
-
flush()とclose()について
-
Javaで改行などが出来ないのです。
-
java 出力されたexcelを並べ替え
-
1~100までの数字を表示し、か...
-
System.out.printlnの出力先
-
GIF画像生成
-
1~100までの数字を表示したい
-
ArrayList内HashMapの取得
-
ダブルクォーテーション(””)...
-
週単位の日付の加算
-
eclipseでコンソールのピン留め...
-
一定のスペースを空けて端を揃...
-
StringTokenizerを使用して、連...
-
system.out.printが出力されない
-
半角カナが含まれる文字列をフ...
-
Tomcatが無応答となる現象が起...
-
PrintWriterとBufferedWriterの...
-
Javaで任意のパスへ任意のファ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
System.err. printlnとSystem.o...
-
Javaで改行などが出来ないのです。
-
1~100までの数字を表示し、か...
-
system.out.printが出力されない
-
1~100までの数字を表示したい
-
System.out.printlnの出力先
-
一定のスペースを空けて端を揃...
-
flush()とclose()について
-
Log4jで機能毎に別ファイルへ出...
-
Tomcatが無応答となる現象が起...
-
行列の表示
-
InputStreamはreadが1回しかで...
-
数字文字列をパック10進数に変...
-
switch分が機能しません。
-
System.out.printlnの意味がよ...
-
JavaScriptの変数をjavaのメソ...
-
Log4Jではログを改行できない?
-
テキストエリアで改行する
-
【SQLServer接続のJSPの記述を...
-
CSVファイルへ出力
おすすめ情報