Aus diesem Array erzeuge ich mit Filtern ein neues Array, das dann nur die gewünschen Sätze enthält.
Um keine ungewollten Referenzen zu erzeugen mache ich das seit Jahren mit aadd(aauswahl,aclone(aalle[xi]))
Jetzt kommt erstmalig eine Datenbank ins Spiel die über 100.000 Sätze enthält.
Das Einlesen in das erste Array funktioniert innerhalb von Sekunden.
Dieses Array in das zweite Array zu übernehmen (mit aclone) funktioniert dann aber nur einmal problemlos.
Ab der zweiten Schleife kommt es zu erheblichen Zeitverzögerungen bis hin zum Rechnerabsturz.
Ohne aclone läuft es wie geschmiert.
Ich habe das hier aus meinen Anwendung auf ein Testprogramm eingeschmolzen.
Code: Alles auswählen
proc main
local getlist:=0,xi:=0
aalle:={}
afilt:={}
for xi = 1 to 5
altzeit=seconds()
fleseein()
? "Runde",xi,len(aalle),len(afilt),seconds()-altzeit
next
inkey(0)
return
*-------------------------------------------------------
function fleseein()
local i:=0
asize(aalle,0)
asize(afilt,0)
use d:\pps\werwas
go top
do while !eof()
aadd(aalle,{user,prog,teil_kom,option,datum,zeit,nn})
skip
enddo
close werwas
for i = 1 to len(aalle)
*aadd(afilt,aclone(aalle[i]))
aadd(afilt,aalle[i])
next
return .t.
Code: Alles auswählen
mit aclone
Runde 1 105719 105719 1,46
Runde 2 105719 105719 174,54
Runde 3 105719 105719 73,15
Runde 4 105719 105719 60,71
Runde 5 105719 105719 47,57
ohne aclone
Runde 1 105719 105719 1,37
Runde 2 105719 105719 1,32
Runde 3 105719 105719 1,26
Runde 4 105719 105719 1,27
Runde 5 105719 105719 1,23
Problem in anderen Anwendungen wohl deshalb noch nicht, weil die Arrays unter 20.000 Sätze enthalten. Da
spielt die Zeit noch keine Rolle.
Wo liegt wohl mein Denkfehler ? Wieder mal was ganz banales ???