背景
这是一个优化问题。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 个文件可供相互比较;将一个文件与所有其他文件进行比较需要 8 分钟。从逻辑上讲,如果A = B
和A = C
,则不需要检查 if 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
将匹配的文件删除到另一个目录中,这样就不需要检查两次。
系统约束
使用带有 SSD 的四核 CPU;尽可能避免使用云服务。该系统是安装了 Cygwin 的基于 Windows 的机器——欢迎使用其他语言的算法或解决方案。
谢谢!