バックグラウンド
これは最適化問題です。Oracle Forms XMLファイルには、次のような要素があります。
<Trigger TriggerName="name" TriggerText="SELECT * FROM DUAL" ... />
ここで、TriggerText
は任意のSQLコードです。各SQLステートメントは、次のような一意の名前のファイルに抽出されています。
sql/module=DIAL_ACCESS+trigger=KEY-LISTVAL+filename=d_access.fmb.sql
sql/module=REP_PAT_SEEN+trigger=KEY-LISTVAL+filename=rep_pat_seen.fmb.sql
私は、ブルートフォースアプローチを使用して正確な重複のリストを生成するスクリプトを作成しました。
問題
互いに比較する37,497個のファイルがあります。1つのファイルを他のすべてのファイルと比較するのに8分かかります。論理的には、A = B
およびA = C
の場合、。かどうかを確認する必要はありませんB = C
。したがって、問題は次のとおりです。冗長な比較をどのように排除しますか?
スクリプトは約208日で完了します。
スクリプトソースコード
比較スクリプトは次のとおりです。
#!/bin/bash
echo Loading directory ...
for i in $(find sql/ -type f -name \*.sql); do
echo Comparing $i ...
for j in $(find sql/ -type f -name \*.sql); do
if [ "$i" = "$j" ]; then
continue;
fi
# Case insensitive compare, ignore spaces
diff -IEbwBaq $i $j > /dev/null
# 0 = no difference (i.e., duplicate code)
if [ $? = 0 ]; then
echo $i :: $j >> clones.txt
fi
done
done
質問
複製されたコードのチェックが数桁速くなるように、スクリプトをどのように最適化しますか?
アイデア#1
一致するファイルを別のディレクトリに移動して、2回検査する必要がないようにします。
システムの制約
SSDでクアッドコアCPUを使用する。可能であれば、クラウドサービスの使用を避けようとします。このシステムは、CygwinがインストールされたWindowsベースのマシンです。他の言語のアルゴリズムやソリューションを歓迎します。
ありがとうございました!