INI file subroutine taking long time to run

Started by erezpaz, January 30, 2018, 05:55:20 AM

Previous topic - Next topic

erezpaz

Hi

I got a subroutine that getting two, two dimension arrays and compare them and write a list of elements in INI file. It looks for specific element in each and if it is the same it write the data. Since I use 4 for command nested it takes long time to complete on array with more them 10 elements. It can take 5,10 even 15 minutes. Can someone look at the code and give his feedback?

Thanks

#DEFINESUBROUTINE WrtieInIJobList()
if tooldebugWBERROR == 0 then IntControl(73,3,0,"OnNextError",0)
WriteLog(LogFile,"Writing list of servers to JOB file",cPC,tool,EVNTerror,TMPdir,1)
IniDeletePvt("JobList", @WHOLESECTION,INIFile)
delay(2)
CheckBusyFile(INIFile)
aJobListfromINIstr = fileopen(INIFile,"APPEND",@FALSE,TimeRetryFileOpen)
filewrite(aJobListfromINIstr,"[JobList]")
ff=""
nRmax1 = ArrInfo(JobListFromGui,1)
nCmax1 = ArrInfo(JobListFromGui,2)
nRmax2 = ArrInfo(JobListfromINIArr,1) ; REPLACE with array from advanced menu
nCmax2 = ArrInfo(JobListfromINIArr,2)
for i = 0 to nRmax1-1 ;GUI
ggg=0
GUIDGUI = JobListFromGui[i,10]
RecoveryPlan = JobListFromGui[i,0]
for j = 0 to nCmax1-1
for a = 0 to nRmax2-1   ;INI
for b = 0 to nCmax2-1
if DRprodMaster == 4 | DRprodMaster == 5 | DRprodMaster == 6  then
if strindex(JobListfromINIArr[a,0],"_*_",1,@FWDSCAN) == 0 then
FirstParamArry = strcat(JobListfromINIArr[a,0],"_*_",RecoveryPlan)
else
FirstParamArry = JobListfromINIArr[a,0]
end if
else
FirstParamArry = JobListfromINIArr[a,0]
end if
strForiniNew = strcat(FirstParamArry,";",JobListfromINIArr[a,1],";",JobListfromINIArr[a,2],";",JobListfromINIArr[a,3],";",JobListfromINIArr[a,4],";",JobListfromINIArr[a,5],";",JobListfromINIArr[a,6],";",JobListfromINIArr[a,7],";",JobListfromINIArr[a,8],";",JobListfromINIArr[a,9],";",JobListfromINIArr[a,10])
strForiniNew = strcat(strForiniNew,";",JobListfromINIArr[a,11],";",JobListfromINIArr[a,12],";",JobListfromINIArr[a,13],";",JobListfromINIArr[a,14],";",JobListfromINIArr[a,15],";",JobListfromINIArr[a,16],";",JobListfromINIArr[a,17],";",JobListfromINIArr[a,18],";",JobListfromINIArr[a,19],";",JobListfromINIArr[a,20],";",JobListfromINIArr[a,21],";",JobListfromINIArr[a,22])
GUIDINI = JobListfromINIArr[a,0]
if DRprodMaster == 4 | DRprodMaster == 5 | DRprodMaster == 6 then
if strindex(JobListfromINIArr[a,0],"_*_",1,@FWDSCAN) <> 0 then GUIDINI = strsub(JobListfromINIArr[a,0],1,strscan(JobListfromINIArr[a,0],"_*_",1,@FWDSCAN)-1)
end if
next
if GUIDINI == GUIDGUI & ggg == 0 then
filewrite(aJobListfromINIstr,strForiniNew)
ggg=1
end if
next
next
if ggg == 0 then
if GUIDGUI <> 0 then
if DRprodMaster == 4 | DRprodMaster == 5 | DRprodMaster == 6 then
GUIDGUI = strcat(GUIDGUI,"_*_",RecoveryPlan,";;;;;;;;;;;;;;;;;;;;;")
else
GUIDGUI = strcat(GUIDGUI,";;;;;;;;;;;;;;;;;;;;;")
end if
filewrite(aJobListfromINIstr,GUIDGUI)
end if
end if
next
fileclose(aJobListfromINIstr)
WriteLog(LogFile,"Finished writing list of servers to JOB file",cPC,tool,EVNTerror,TMPdir,1)
return
#ENDSUBROUTINE

td

You have created close to an O(n4) solution.  It is going to be slow.  Without knowing your data sources it is difficult to suggest an alternative but you might consider a sort and search approach to the problem.   It may or may not be a more efficient solution.   
"No one who sees a peregrine falcon fly can ever forget the beauty and thrill of that flight."
  - Dr. Tom Cade

td

Should mention that the ArraySort and ArraySearch functions can be, as the names suggest, used for sorting and searching arrays.
"No one who sees a peregrine falcon fly can ever forget the beauty and thrill of that flight."
  - Dr. Tom Cade

erezpaz

I changed it to use ArraySearch and it improve the time from 5 min to 5 sec !!