- ベストアンサー
javaで大きなファイルを解析できますか?
100MBくらいのアクセスログをjavaを使って解析しようと思うのですが、どうしても、エラーが出ます。 読み込み方が間違っているのでしょうか? まったくわかりません。 教えていただけないでしょうか? また、これを知ったきっかけも教えていただけましたら幸いです。 宜しくお願い致します。 読み込みの部分↓↓↓ class kaiseki { public static void main(String[] args) throws Exception { InputStream is = new FileInputStream("log.txt"); BufferedReader br = new BufferedReader(new InputStreamReader(is));
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
>これでは、まずいのでしょうか? Javaが扱えるメモリの最大量は、デフォルト値(J2SEのバージョンやプラットホームに依存)が決まっています。実メモリをいくら多く積んでいようが、その値以上は使われません。デフォルト値以上のメモリをJavaで使いたい場合は、javaコマンドの起動オプションで指定します。 >すべての情報が100Mで1行 本当にそうなっていますか? ログファイルはたいてい、レコード(一回のアクセス記録)の区切りが改行になっているかと思います。 ただしWindowsのメモ帳などは、「CRLF」のみを改行コードだと認識します。ファイル内で「CR」または「LF」が改行コードに使われている場合は、メモ帳は改行だと認識せずに、あたかも1行のファイルであるかのように表示します。 ともあれ、今回のログファイルのレコード区切り文字をご確認ください。 >以下、もしお時間がありましたら教えてください。 話題が変わる場合は、別に質問を立てるほうがよいです。 さて既存のコードをお手本にするのは、プログラミング学習の基本であり、それでよいと思います。 ただし多くの学習者は「エラーが出た⇒思考停止」になってしまいます。 エラーメッセージはバグの最大の手がかりですから、これをよく読んで原因を考えるべきです。 どうしても検討できなければ、エラーメッセージをGoogle検索にかければ問題点がわかることがあります。 「エラーを一つ直すごとにプログラミングが一歩上達する」と思ってください。
その他の回答 (2)
質問文の中のソースはストリームの生成までですが、その後の読み込みの処理はどうなっているでしょうか。 読み込んだファイルの内容をすべて変数に保持しようとしていませんか。100MBのファイルに対してそうしていれば、当然メモリ不足に陥ります。 アクセスログのようなファイルでしたら、BufferedReaderのreadLine()で1行単位で読み込む方法がよいと思います。 また一般に、プログラミングの相談の際にはぜひとも >正確なエラー情報 をお願いします。
どのようなエラーが出てるのでしょう?
補足
回答いただきありがとうございます。 具体的には、プログラム実行中にフリーズしてしまって解析ができない。 運良く解析できても、出力のところでファイルに書き込みができませんでした。の旨のエラーが出ます。(正確なエラー情報は忘れてしまいました。すみません。) 出力には、下記の命令のみを使っています。 fr = new FileWriter("出力.txt"); あと、あまり関係ないかもしれませんが、、入力には、Buffered~を使っていますが、出力には、Buffered~は使っていません。
補足
回答いただきありがとうございます。 >読み込んだファイルの内容をすべて変数に保持しようとしていませんか。 正に、その通りです。これでは、まずいのでしょうか?(PCのメモリは512MBあるので大丈夫かと思ったのですが・・・) また、logファイルの性質上、すべての情報が100Mで1行で作成されています。そのため、1行という単にはありません。 何かよい方法はないでしょうかね? また一般に、プログラミングの相談の際にはぜひとも >正確なエラー情報 をお願いします。 指摘ありがとうございます。以降気をつけます。 以下、もしお時間がありましたら教えてください。(相談です) 多分、上記のような質問は初歩的?なのかも知れませんが、私には、正直、ほとんど、理解できていません。今までも、ネット上からソースをコピペして貼り付けてエラーがでなければよしとしてやってきています。それでもわからなければ人に聞く。というやり方。 しかし、できれば、人に迷惑をかけることなく、効率的にバリバリプログラムを勉強したいと思っていますが、どういった勉強方法が考えられますか?もしよろしければ、教えてください。 よろしくお願いいたします。