我使用二维 Coldfusion 数组作为计数器来跟踪不同的出现次数。但是,我发现由于数组声明很大,处理需要很长时间。我就是这样做的:
<!--- retrieve data from the first db --->
<cfquery datasource="xxx" name="mylist">
SELECT id, pattern1
FROM mydatabase
</cfquery>
<!--- initialize the array --->
<cfset myarray = ArrayNew(2)>
<cfloop index = "i" from = "1" to = "8000">
<cfset myarray [#i#][1] = i>
<cfset myarray [#i#][2] = 0>
</cfloop>
<!--- start accumulating. adigit can be any numbers from 1 to 8000 and can repeat --->
<cfoutput query="mylist">
<cfquery datasource="xxx" name="mylist">
SELECT adigit
FROM otherdatabase
WHERE pattern2 = #pattern1#
</cfquery>
.....
<cfset myarray[adigit][2] = myarray[adigit][2] + 1>
</cfoutput>
<!--- sort them in descending order --->
<cfloop index="outer" from="1" to="#arrayLen(myarray )#">
<cfloop index="inner" from="1" to="#arrayLen(myarray )-1#">
<cfif myarray [inner][2] lt myarray [outer][2]>
<cfset arraySwap(myarray ,outer,inner)>
</cfif>
</cfloop>
</cfloop>
adigit字段可以是1到8000之间的任意数字。所有重复的数字都应该累加。例如,如果 adigit=45 出现 12 次,则 myarray[45][1] = 45 且 myarray[45][2] = 12。但是,结果数组的值可能只有 8000 中的 400。其余的都将是 0,因为它们没有匹配的数字。
由于所有“未使用”的数组和排序,处理时间比平时要长。有没有更有效的方法来做到这一点?
提前谢谢您。
你可以做的一件事就是改变这一点:
<cfoutput query="mylist">
<cfquery datasource="xxx" name="mylist">
SELECT adigit
FROM otherdatabase
WHERE pattern2 = #pattern1#
</cfquery>
.....
<cfset myarray[adigit][2] = myarray[adigit][2] + 1>
</cfoutput>
像这样:
<cfquery datasource="xxx" name="mylist">
SELECT adigit
FROM otherdatabase
WHERE pattern2 = in (valuelist from previous query)
ORDER by adigit
</cfquery>
<cfoutput query="myList">
<cfset myarray[adigit][2] = myarray[adigit][2] + 1>
</cfoutput>
之后就很难说了,因为不清楚你想要实现什么。