
No.3ベストアンサー
- 回答日時:
ファイル1:5万件
ファイル2:5万件
ファイルA-Z:ファイル1を頭文字に分類したファイルファイル
手順1.ファイル1→ファイルA-Zに分類
手順2.ファイル2を1件ずつ読んでファイルA-Zに存在するかどうかをチェック
この手順だとファイルアクセスが多すぎます。
(特にオーバヘッドの高いオープン処理とクローズ処理が多すぎる)
手順1でファイル1の内容を1件ずつ読み込んで処理しているのだからここでハッシュテーブルを作ってはどうでしょう?
手順2でハッシュ検索を行えばマッチングは単純です。
ファイル1の内容を「5万件*平均数十バイト」と想定すると数メガバイトに収まります。
一般的なPerlが動作する処理系ではメモリ内で処理可能な容量だと思いますが…
この回答への補足
ご指摘ありがとうございます。
ハッシュテーブルがどういうものか良く分からないのですが、
以下のように処理すれば良いということでしょうか?
これなら、処理が早そうな気がします。
foreach (@data_a){ $flag{$_} = 1; }
foreach (@data_b){
if(!$flag{$_}){ print "$_はデータAに存在しません。\n"; }
else{ print "$_はデータAに存在します。\n"; }
}
もっと良い方法があれば教えてください。
宜しくお願いします。
No.4
- 回答日時:
> ファイルAのデータ 1234567 と完全一致するデータがファイルBに存在するかを確認したいです。
ということであれば、
% cat b.pl
open( IN, $ARGV[0] ) or die "?! $ARGV[0] - $!,";
while ( <IN> ){ chomp; $hash{ $_ } = 1; }
close( IN );
open( IN, $ARGV[1] ) or die "?! $ARGV[1] - $!,";
while ( <IN> ){ chomp;
$rc = defined $hash{ $_ } ? 'Exist' : 'None';
print $_, ' - ', $rc, ".\n";
}
close( IN );
――ってのは、どうでしょう。toysmithさんが回答されている連想配列を使ったもの。
実験:
% cat a.pl
for ( $i = 0; $i < 50000; $i++ ){
$l = int( rand( 3 ) ) + 3;
$s = '';
for ( $k = 0; $k < $l; $k++ ){
$s .= ( '0' .. '9', 'a' .. 'z', 'A' .. 'Z', '+', '-', '*', '/' )[ int( rand( 64 ) ) ];
}
print $s, "\n";
}
% perl a.pl >a.dat
% perl a.pl >b.dat
% time perl b.pl a.dat b.dat > result.txt
0.910u 0.070s 0:01.45 67.5% 0+0k 0+3io 0pf+0w
――2秒かかんないですね。
PowerPC/500MHz+Mem320MB+Mac OS X 10.2+perl5.6.0で試してます。
No.2
- 回答日時:
sortしてdiffとか。
toysmithさんもおっしゃってますが、結局、アルゴリズムを改良しなくてはいけませんが、そのために必要な、データの詳細についての説明が不足しているので、なんとも言いかねるかと。
この回答への補足
すいません。説明不足でした。
データ5万件とは
1234567
f39a4000
c4f7
という感じの桁数もランダムな乱数のデータ5万件が入ったファイル対ファイルです。
ファイルAのデータ 1234567 と完全一致するデータがファイルBに存在するかを確認したいです。
現在、試してみた処理として、
ファイルAのデータを頭文字毎に分別したファイルを作成・出力(a.txt,b.txt・・・)し、
ファイルBのデータの頭文字から、出力ファイルを読み込んで存在の有無を確認してます。
これでは厳しいでしょうか?
データベースはSQLとかのことでしょうか?
そうであれば、使える環境がありません
No.1
- 回答日時:
比較ってどういう比較ですか?
「レコードごとにキー項目一致を抽出」という前提なら手っ取り早くデータベースを使うのが一般的では?
データベースが使えない状況ならハッシュを実装するか。
詳細がわからない(データ属性、比較条件など)ので一般論に過ぎません。
よって自信なし。
この回答への補足
すいません。説明不足でした。
データ5万件とは
1234567
f39a4000
c4f7
という感じの桁数もランダムな乱数のデータ5万件が入ったファイル対ファイルです。
ファイルAのデータ 1234567 と完全一致するデータがファイルBに存在するかを確認したいです。
現在、試してみた処理として、
ファイルAのデータを頭文字毎に分別したファイルを作成・出力(a.txt,b.txt・・・)し、
ファイルBのデータの頭文字から、出力ファイルを読み込んで存在の有無を確認してます。
これでは厳しいでしょうか?
データベースはSQLとかのことでしょうか?
そうであれば、使える環境がありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(コンピューター・テクノロジー) この用途で快適に使うにはどのくらいのスペックのパソコンを買うべきなのでしょうか? ・100ギガのデー 4 2023/07/20 19:50
- スポーツサイクル クロスバイクとロードバイクの速度差は 4 2023/04/15 23:12
- その他(ビジネス・キャリア) 公務員と民間について質問です 自分は大卒で公務員に現役合格しました。 大体大学3年から1500時間位 6 2022/09/19 14:20
- 歴史学 儒教と親孝行 4 2022/11/17 09:40
- BTOパソコン PCの選び方 6 2022/09/11 00:16
- その他(コンピューター・テクノロジー) パソコンは同時に作業をすることが出来るらしいですが以下の動作の全てを同時にすることも可能なのですか? 5 2023/07/22 11:20
- 体重計・体脂肪計・体組成計 スマートウォッチや体重計のデータをパソコンで処理できませんか?スマホアプリでは限定的で!? 3 2022/10/09 08:10
- 統計学 看護研究でサンプルサイズが異なるデータの比較 7 2022/11/05 15:48
- Excel(エクセル) 配列操作について 5 2023/04/18 07:27
- システム 「パソコンA」から「パソコンB」にインターネット経由で ファイルを送りたいとき 4 2023/01/11 14:14
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBA コードが同じでも...
-
JavaでCSVファイルを高速に読む...
-
データが消失してしまう
-
VBAでCSVファイルを途中行まで...
-
5万件対5万件のデータを高速...
-
CSVが可変長の場合の検索方法
-
MATLAB グローバル変数の宣言
-
ReadLineでの読み出し行を指定する
-
lockについて
-
perlであるcsvファイルのキーワ...
-
perlのreadコマンドで変数に読...
-
VBAで巨大なファイルの途中から...
-
perlでWin32::APIを使用してDLL...
-
drtファイルはどうしたら開...
-
csvファイル(表計算的な処理)
-
perlでWMV形式のファイルをダウ...
-
batファイルでrenameができませ...
-
<>の意味が分かりません
-
MATLABのm-fileについて
-
1行がやたら長いテキストをバッ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBA コードが同じでも...
-
VBAでCSVファイルを途中行まで...
-
MATLAB グローバル変数の宣言
-
openした後、closeしないでプロ...
-
ExcelをCSV書き出す場合のシー...
-
ReadLineでの読み出し行を指定する
-
VB6.0でDB接続する際に切断時の...
-
Perlの変数に文字数制限(容量...
-
JavaでCSVファイルを高速に読む...
-
VBAで巨大なファイルの途中から...
-
C言語でのファイルのデータ更...
-
C#でCSVファイルを逐一更新したい
-
perl内でPHPを動かす?
-
CSVファイルの内容を編集する方...
-
指定行データの取得
-
CSV出力に関して
-
拡張子 ”log” と ” dat” の違い
-
open( ) の読み込み量
-
ファイル内の日付から1週間前...
-
perlについて、教えてください。
おすすめ情報