Ich habe ein Array von Verzeichnisnamen und Statistiken wie Eigner, Änderungsdatum, Dateianzahl, Gesamtdateigröße usw. Beim Hinzufügen von 133 neuen Verzeichnisnamen zum Bash-Array von etwa 2.700 vorhandenen Verzeichnisnamen dauert es etwa 1/2 Stunde um es zu sortieren. Die Zeit ist nicht akzeptabel und wie kann es verbessert werden (HINWEIS: * Dies ist eine selbst beantwortete Frage).Wie beschleunigt man 1/2 Stunde, um 133 neue Einträge im Bash-Array mit 2.700 Einträgen im RAM zu sortieren?
Ich habe versucht, ein assoziatives Array zu erstellen, um die Verarbeitung zu beschleunigen, aber es nicht sequenzielles Lesen von Schlüsseln erlaubt, nur einige zufällige Hash-Tabelle unsortierten Reihenfolge.
ist das relevante Codefragment:
#-------------------------------------------------------------------------------
BubbleSortDirsArr() {
cp ~/.bafmanDirs ~/.bafmanDirs~ #Make backup copy
IFS="|" read -ra DirsArr < ~/.bafmanDirs
DirsArrCnt=${#DirsArr[@]}
DirsArrUnsetCount=0
TotBump=0
Sorted=false
while [[ $Sorted == false ]]; do
Sorted=true
i=0 # TODO: Use HoldNdx to update progress
LastNdx=0
LastKey=""
EOF=false # fudge it
while [[ $i -lt $DirsArrCnt ]] ; do
DirsArr[$i]=false
CurrNdx=$i
CurrKey=$(echo "${DirsArr[$(($i + 1))]}" | tr -dc '[:alnum:]/')
if [[ "$CurrKey" > "$LastKey" ]] || [[ "$CurrKey" == "$LastKey" ]]; then
LastNdx=$CurrNdx
LastKey="$CurrKey"
i=$(($i + $OneDirArrCnt))
continue
fi
HoldNdx=$(($CurrNdx + $OneDirArrCnt)) # When done we'll restart here.
if [[ $HoldNdx -ge $DirsArrCnt ]] ; then
echo "%%%%%%%%%%%%%%%%%%%%%%%% Hold>Last OVERRIDE: "
echo "HoldNdx: $HoldNdx CurrNdx: $CurrNdx LastNdx: $LastNdx"
echo "CurrKey: $CurrKey"
echo "LastKey: $LastKey"
HoldNdx=$CurrNdx # Curr= last array entry, restart at LastKey swapped
EOF=true # fudge it
fi
# If last index > curr index, we can't swap
if [[ $LastNdx -gt $CurrNdx ]] ; then
echo "ABORT!!! LastNdx: $LastNdx greater than CurrNdx: $CurrNdx"
echo "CurrKey: $CurrKey"
echo "LastKey: $LastKey"
exit
fi
Sorted=false # Restart sort from array top later
printf "= START ====================== Loop 3:"
echo " HoldNdx: $HoldNdx CurrNdx: $CurrNdx LastNdx: $LastNdx"
echo " CurrKey: $CurrKey"
echo " LastKey: $LastKey"
Bump=0
while [[ "$CurrKey" < "$LastKey" ]] || [[ "$CurrKey" == "$LastKey" ]] ; do
Bump=$(($Bump + 1))
# Move Last entry to work array
WorkArr=()
j=$LastNdx
for ((c=1; c<=$OneDirArrCnt; c++)); do WorkArr+=("${DirsArr[j++]}"); done ;
# Move current entry to last entry
j=$LastNdx
k=$CurrNdx
for ((c=1; c<=$OneDirArrCnt; c++)); do DirsArr[j++]="${DirsArr[k++]}"; done ;
# Move work entry to what was current entry (swap)
j=$CurrNdx
k=0
for ((c=1; c<=$OneDirArrCnt; c++)); do DirsArr[j++]="${WorkArr[k++]}"; done ;
CurrNdx=$LastNdx # Step back one entry
LastNdx=$(($CurrNdx - $OneDirArrCnt))
if [[ $LastNdx -ge 0 ]]; then
LastKey=$(echo "${DirsArr[$(($LastNdx + 1))]}" | tr -dc '[:alnum:]/')
else
echo "+++++++++ Loop 3 Bumped: $Bump to top CurrNdx: $CurrNdx CurrKey: $CurrKey"
echo "WorkArr: ${WorkArr[*]}"
break
fi
done # CurrKey is now > LastKey, stop swapping
TotBump=$(($TotBump + $Bump))
printf " - END ---------------------- Loop 3:"
echo " HoldNdx: $HoldNdx CurrNdx: $CurrNdx LastNdx: $LastNdx Bumped: $Bump"
echo " CurrKey: $CurrKey"
echo " LastKey: $LastKey"
i=$HoldNdx
done
echo "Loop 2 bottom: i: $i HoldNdx: $HoldNdx CurrNdx: $CurrNdx LastNdx: $LastNdx"
echo " CurrKey: $CurrKey"
echo " LastKey: $LastKey"
TotLoop=$(($TotLoop + 1))
done
printf "* * * * * * * * * Loop 1 bottom - Total Loops: $TotLoop"
echo " Bumps: $TotBump * * * * * * * * *"
echo "${DirsArr[*]}" > ~/.bafmanDirs # "*" preserves separtator, "@" does not.
} ### BubbleDirsArr()
Hier wird die letzten Zeilen der Programmausgabe sind:
= START ====================== Loop 3: HoldNdx: 24700 CurrNdx: 24700 LastNdx: 24690
CurrKey: /home/rick/cache/yelp/WebKitCache/Version10/Blobs
LastKey: /srv
- END ---------------------- Loop 3: HoldNdx: 24700 CurrNdx: 5580 LastNdx: 5570 Bumped: 1912
CurrKey: /home/rick/cache/yelp/WebKitCache/Version10/Blobs
LastKey: /home/rick/cache/yelp/WebKitCache/Version10
Loop 2 bottom: i: 24710 HoldNdx: 24700 CurrNdx: 24700 LastNdx: 24700
CurrKey: /srv
LastKey: /srv
Loop 2 bottom: i: 24710 HoldNdx: 24700 CurrNdx: 24700 LastNdx: 24700
CurrKey: /srv
LastKey: /srv
* * * * * * * * * Loop 1 bottom - Total Loops: 135 Bumps: 257158 * * * * * * * * *
real 29m27.445s
user 14m39.636s
sys 2m5.596s
Es gibt keine '~/.bafmanDirs' auf meinem System. Wie würde ich das verwenden? –