- ベストアンサー
Javaで同一のファイルを読み込みながら集計できますか?
- Javaで同一のファイルを読み込みながら集計する方法について知りたいです。
- 読み込むファイル内のデータ量が多いため、ソートもされていないため、ファイルを読み込みながら、行ごとに比較し、集計を行いたいです。
- ただし、データ量が大きい場合は処理に時間がかかる可能性があるため、現実的な方法かどうかも知りたいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
質問は、「同一ファイルを複数のストリームで開けられるか」と言うことでしたが、 これは忘れましたのでわかりません。 読込専用で開くなら大丈夫な気がしますが、 小規模なテストプログラムを作れば検証できるので、やってみてください。 最悪、「ファイルをコピーしてから2つ読み込む」という方法もあるでしょう。 問題はむしろ処理時間にあるように思います。 n^2に比例した時間がかかるのは、アルゴリズム的にしょうがないです。 しかし、メモリから読み込むのと、ディスクから読み込むのとでは、 まさしくケタ違いの時間がかかるので、 入出力関数を使って数百万×数百万のループを回すのは無理なような気がします。 最悪、10年走らせてやっと解けたということになるかもしれません。 考えられることを書きます。 (1)ファイルをソートしてしまう ソートすると効率が向上するデータ構造の場合、ファイルを先にソートしてしまうのも手です。 ソート自体は重い処理ですが、n^2よりは早い方法があるので、 結局は早かったということになる可能性もあります。 この場合、データの内容にも依りますが、 マージソートあたりを使うのが適当でしょうか。 (2)適当な数だけまとめる 数百万のArrayを作ることは無理でも、1000とか10000とかのArrayを作ることは可能だと思います。 ファイルを、先頭から1000行とか10000行に分けて、区画ごとに入力して 比較作業を行います。 たとえば、1万行のファイルがあるとすると、それを1000行の区画A~Jに分割します。 そして、「AとA」「AとB」...「AとJ」「BとA」...「JとJ」 のように、区間ごとにまとめて比較して、最後に集計します。 プログラムがかなり複雑になりますが、 ディスクからの読み出し処理の単位数が激減しますので、 処理速度は速くなるはずです。 参考になれば…。
その他の回答 (2)
- choconamacream
- ベストアンサー率44% (152/338)
実行処理の時間(ターンアラウンドやレスポンスに、スループットとか?)に関してはよく分からないのですが、ふと思ったのが、DBは利用できないのかなあと。そもそも、こういった処理が得意なのが、RDBMSですから。 Oracle Database 10gなどであれば、列方向(→)は1000までですが、行方向(↓)は無制限です。(よって、理論上はハードディスクの容量が許す限り、数千万行のテーブル操作なども可能だと思う。) 実際の処理に関しても、2つのテーブル内の値を「比較し、集計」する部分をVALUES句ではなく副問い合わせで記述し、その結果を事前に作成しておいた新しいテーブル内にINSERTすればいいんじゃないかなと思ったのですが・・。 それに、JDK6であれば標準で使用可能な「Java DB」を使う手もあると思いますが。(私は、未だ使用したことがないので、こっちの方はよく分かりませんけども。)
お礼
liar_adanさん、回答ありがとうございました。 ログのバックアップ処理(DB負荷軽減)の策なので DBは残念ながら使用できないんです・・・。
- _ranco_
- ベストアンサー率58% (126/214)
とにかく、ファイルの全行をArrayList<String>に読み込んでから、必要な処理をしてください。つまり、オンメモリ処理がもっとも高速。
お礼
_ranco_さん、回答ありがとうございました。
補足
ArrayList<String>に代入したいのですが、 データが大量(数百万)のため、 ヒープサイズエラーとなってしまいます。 何か良い方法があればと思案しております。
お礼
liar_adanさん、回答ありがとうございました。
補足
liar_adanさん、回答ありがとうございます。 >(1)ファイルをソートしてしまう コレが出来たら良いとおもっておりました。 そうすれば、1件目と2件目、1件目と3件目と判断できると思うので。 マージソートについて、調べてみます。 もし、サンプルプログラムなどがあるホームページが わかりましたら、教えてください。 >(2)適当な数だけまとめる ファイルをどこまで読んだかという区切り方が わかりませんでしたので、この方法でできませんでした。 もし、方法がわかりましたら、教えていただければと思います。 いろいろとお世話をおかけします。