プロが教えるわが家の防犯対策術!

お世話になります。よろしくお願いいたします。
(JDK:jdk1.6.0_07 環境:Solaris)

読み込むファイル内のデータ量が多いため、
また、ソートもされていないため、
ファイルを読み込みながら、
1行目と全行比較し、集計をListに保管
2行目と全行比較し、集計をListに保管
・・・・
といったようなことをしたいのですが、可能でしょうか?

下記のようなイメージなのですが

//1行目取得
count=0;
while (br.ready()) {
line = br.readLine();
String str1 = 値1;
    //全件取得
    while (br2.ready()) {
 String str2 = 値1;
     //比較し、集計
if(str1 = str2){
count++;
      list.add(str1);
}
    }
}

100件でも、100*100回 Loopするので大量データを扱うのに
あまり現実的ではないかもしれませんが・・・。

A 回答 (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」
のように、区間ごとにまとめて比較して、最後に集計します。
プログラムがかなり複雑になりますが、
ディスクからの読み出し処理の単位数が激減しますので、
処理速度は速くなるはずです。
参考になれば…。

この回答への補足

liar_adanさん、回答ありがとうございます。
>(1)ファイルをソートしてしまう
コレが出来たら良いとおもっておりました。
そうすれば、1件目と2件目、1件目と3件目と判断できると思うので。

マージソートについて、調べてみます。
もし、サンプルプログラムなどがあるホームページが
わかりましたら、教えてください。

>(2)適当な数だけまとめる
ファイルをどこまで読んだかという区切り方が
わかりませんでしたので、この方法でできませんでした。
もし、方法がわかりましたら、教えていただければと思います。

いろいろとお世話をおかけします。

補足日時:2008/07/13 12:37
    • good
    • 0
この回答へのお礼

liar_adanさん、回答ありがとうございました。

お礼日時:2008/07/16 23:56

実行処理の時間(ターンアラウンドやレスポンスに、スループットとか?)に関してはよく分からないのですが、ふと思ったのが、DBは利用できないのかなあと。

そもそも、こういった処理が得意なのが、RDBMSですから。

Oracle Database 10gなどであれば、列方向(→)は1000までですが、行方向(↓)は無制限です。(よって、理論上はハードディスクの容量が許す限り、数千万行のテーブル操作なども可能だと思う。)

実際の処理に関しても、2つのテーブル内の値を「比較し、集計」する部分をVALUES句ではなく副問い合わせで記述し、その結果を事前に作成しておいた新しいテーブル内にINSERTすればいいんじゃないかなと思ったのですが・・。

それに、JDK6であれば標準で使用可能な「Java DB」を使う手もあると思いますが。(私は、未だ使用したことがないので、こっちの方はよく分かりませんけども。)

参考URL:http://www.atmarkit.co.jp/fjava/column/koyama/ko …
    • good
    • 0
この回答へのお礼

liar_adanさん、回答ありがとうございました。
ログのバックアップ処理(DB負荷軽減)の策なので
DBは残念ながら使用できないんです・・・。

お礼日時:2008/07/16 23:58

とにかく、ファイルの全行をArrayList<String>に読み込んでから、必要な処理をしてください。

つまり、オンメモリ処理がもっとも高速。

この回答への補足

ArrayList<String>に代入したいのですが、
データが大量(数百万)のため、
ヒープサイズエラーとなってしまいます。
何か良い方法があればと思案しております。

補足日時:2008/07/13 10:22
    • good
    • 0
この回答へのお礼

_ranco_さん、回答ありがとうございました。

お礼日時:2008/07/13 12:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!