WinBatch® Technical Support Forum

All Things WinBatch => WinBatch => Topic started by: erezpaz on January 30, 2018, 05:55:20 AM

Title: INI file subroutine taking long time to run
Post by: erezpaz on January 30, 2018, 05:55:20 AM
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
Title: Re: INI file subroutine taking long time to run
Post by: td on January 30, 2018, 07:40:43 AM
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.   
Title: Re: INI file subroutine taking long time to run
Post by: td on January 30, 2018, 05:50:51 PM
Should mention that the ArraySort and ArraySearch functions can be, as the names suggest, used for sorting and searching arrays.
Title: Re: INI file subroutine taking long time to run
Post by: erezpaz on January 31, 2018, 05:11:57 AM
I changed it to use ArraySearch and it improve the time from 5 min to 5 sec !!