お世話になります。よろしくお願いいたします。
(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するので大量データを扱うのに
あまり現実的ではないかもしれませんが・・・。
No.2ベストアンサー
- 回答日時:
質問は、「同一ファイルを複数のストリームで開けられるか」と言うことでしたが、
これは忘れましたのでわかりません。
読込専用で開くなら大丈夫な気がしますが、
小規模なテストプログラムを作れば検証できるので、やってみてください。
最悪、「ファイルをコピーしてから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)適当な数だけまとめる
ファイルをどこまで読んだかという区切り方が
わかりませんでしたので、この方法でできませんでした。
もし、方法がわかりましたら、教えていただければと思います。
いろいろとお世話をおかけします。
No.3
- 回答日時:
実行処理の時間(ターンアラウンドやレスポンスに、スループットとか?)に関してはよく分からないのですが、ふと思ったのが、DBは利用できないのかなあと。
そもそも、こういった処理が得意なのが、RDBMSですから。Oracle Database 10gなどであれば、列方向(→)は1000までですが、行方向(↓)は無制限です。(よって、理論上はハードディスクの容量が許す限り、数千万行のテーブル操作なども可能だと思う。)
実際の処理に関しても、2つのテーブル内の値を「比較し、集計」する部分をVALUES句ではなく副問い合わせで記述し、その結果を事前に作成しておいた新しいテーブル内にINSERTすればいいんじゃないかなと思ったのですが・・。
それに、JDK6であれば標準で使用可能な「Java DB」を使う手もあると思いますが。(私は、未だ使用したことがないので、こっちの方はよく分かりませんけども。)
参考URL:http://www.atmarkit.co.jp/fjava/column/koyama/ko …
liar_adanさん、回答ありがとうございました。
ログのバックアップ処理(DB負荷軽減)の策なので
DBは残念ながら使用できないんです・・・。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- PHP PHP MySql ページング 2 2022/09/20 06:38
- Visual Basic(VBA) VBA 毎日取得するデータを順番に反映していく方法 6 2023/08/26 16:22
- Excel(エクセル) 【マクロ】同じフォルダ内にある複数ブックから1つのブック内の1シートにデータを集めたい 6 2022/09/28 18:16
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- Excel(エクセル) Excel、同じフォルダ内のExcelファイルの特定シートのみを1つのファイルに集約したい 8 2022/09/07 15:12
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAでCSVファイルを途中行まで...
-
VBAでCSVファイルの特定行を書...
-
Javaで同一のファイルを読み込...
-
ファイルのアップロード方法(Perl)
-
perlで、後ろの行を読んで、前...
-
VB6.0でDB接続する際に切断時の...
-
ExcelをCSV書き出す場合のシー...
-
CGI(Perl)でWeb上から作成...
-
ファイルからある文字列の個数...
-
エクセルVBA コードが同じでも...
-
datファイルってなんですか?
-
タブの色を変更する方法
-
【PHP】アクセス過多でファ...
-
ファイル全てを .xlsm に変更し...
-
VBAでタブ区切りテキストの保存...
-
エクセルVBAで素数だけを出力す...
-
コマンドプロンプトからperlを...
-
perlでcsvファイルを読む(ダブ...
-
Perlで特定行から特定行までを...
-
flockについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでCSVファイルを途中行まで...
-
VBAで巨大なファイルの途中から...
-
ExcelをCSV書き出す場合のシー...
-
VBAでCSVファイルの特定行を書...
-
openした後、closeしないでプロ...
-
ReadLineでの読み出し行を指定する
-
エクセルVBA コードが同じでも...
-
csvファイル改行コードの置換に...
-
C言語でのファイルのデータ更...
-
Perlの変数に文字数制限(容量...
-
perlにて2つのファイル比較
-
JavaでCSVファイルを高速に読む...
-
VB6.0でDB接続する際に切断時の...
-
MATLAB グローバル変数の宣言
-
alarmのタイムアウト後の処理で...
-
DBMとテキストファイルのどちら...
-
perlで、後ろの行を読んで、前...
-
エクセルVBAでCSVファイ...
-
拡張子 ”log” と ” dat” の違い
-
5行おきに5行ずつ抽出するに...
おすすめ情報