人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

超高速比較検索アルゴリズムについて
以下のようなデータがテキストファイルで2つ、1つが4MB程度あります。

216.221.5.0/24
210.51.225.0/24
210.34.240.0/24
・・・・
・・・・

このデータファイルdat1とdat2を比較してdat1からdat2で増えたものとdat1からdat2で無くなったものをそれぞれ、plus.dat、minus.datへと出力したいです。

dat1 dat2
216.221.5.0/24 216.221.5.0/24
210.51.225.0/24 1.1.1.1/10
ならば
plus.dat minus.dat
1.1.1.1/10 210.51.225.0/24
のようにです。
今はperlでdat1とdat2を比較してandのデータをファイルに出力して、andデータとdat1,dat2と比較して差分を出すというアルゴリズムです。andを取るアルゴリズムです。頭を使ってないので非常に遅いです。これを劇的に早くする方法を教えてください。
while($var1=<READ1>)
{
open(READ2,$re2)||die "can't open file #2";
while($var2=<READ2>)
{
if($var1 eq $var2)
{
print WRITE1 $var1;
close(READ2);
}
}

}

●質問者: labtest
●カテゴリ:コンピュータ インターネット
✍キーワード:24 dat EQ MB open
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● i_kumagoro
●20ポイント

提示された部分のみの代替としては

my %temp;
open(READ2,$re2)||die "can't open file #2";
while($var2=<READ2>)
{
 $temp{$var2} = 1;
}
close(READ2);

while($var1=<READ1>)
{
 if(defined($temp{$var1}))
 {
 print WRITE1 $var1;
 }
}

のようなコードでどうでしょうか。

メモリが許すのであればアルゴリズムを変更し、両方のファイルをハッシュに読み込んで比較したほうが速いと思います。

また、perlで完結する事にこだわるのでなければ、それぞれのファイルをsortしてからdiffをとった結果を加工するのが楽だと思います。


2 ● zzz_1980
●50ポイント ベストアンサー
#!/bin/sh
sort <dat1.log >_zz_tmp$$
sort <dat2.log >__zz_tmp$$
diff -u _zz_tmp$$ __zz_tmp$$|grep "^[+-][0-9]"|sed -e 's/^./& /'|awk '$1=="+"{print $2 >"plus.dat";}$1=="-"{print $2 >"minus.dat";}'
rm _zz_tmp$$
rm __zz_tmp$$
# for debug
echo "==plus.dat=="
cat plus.dat
echo "==minus.dat=="
cat minus.dat
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ