Hallo Hubert,
ich verwende eine ähnliche Funktion, um große Strings anhand von Tokens aufzuteilen (in einen Array). Und das seit langem und in vielen Fällen. Aber wenn der Array richtig groß wird (in kurzer Zeit), macht Xbase irgendwann die Grätsche. Bei mir ging es konkret um eine Datanorm-Datei mit 150MB, die zu einem mehrdimensionalen Array mit rund 1,4 Mio "Zeilen" (je Zeile zwischen 10 und 20 "Felder") führt.
Ich weiß, ist "viel zu viel", aber ich dachte in meinem nicht mehr ganz jugendlichen Leichtsinn, dass das für ein 32bit-System kein Problem sein sollte.
Ich habe dann den Algorithmus so umgestellt, dass ich einen Array nur aus Zeilen baue (eben die 1,4 Mio), dann Zeile für Zeile vorgehe und jede einzeln wiederum in einen Array aus "Feldern" aufteile. Wenn ich dazwischen dann genügend anderen Code ausführe (in DBF schreiben, was überprüfen, ...), dann geht das Ganze auch (ausser dass nachher 400MB Speicher mehr belegt sind, die nicht mehr freigegeben werden).
Wenn ich aber nur folgendes mache:
Code: Alles auswählen
aZeilen := wToken(cGroßerString, CRLF)
nAnz := len(aZeilen)
for i := 1 to nAnz
aSpalten := wToken(aZeilen[i], ";")
next
dann fliegt mir das Ganze um die Ohren (teilweise schon nach 15000 Sätzen). Ein sleep (mit verschiedendsten Werten getestet) in der for-Schleife hilft nut bedingt (ich komme dann in der Regel weiter, aber auch nicht sehr viel weiter).
Nur wenn sich in der for-Schleife anderer Code abspielt, funktioniert es...
In der wToken-Funktion habe ich mit unterschiedlichen "Array-Erzeugungs-Methoden" gearbeitet (aadd, fest dimensionieren, bei jedem i dimensionieren, ...). Kurioserweise hat aadd am besten funktioniert (da ist die Schleife am weitesten gekommen).
Wie bereits geschrieben, habe ich das Testprogramm (12 Zeilen + 23 Zeilen für die wToken-Funktion) inkl. Daten an Alaska geschickt und habe das Ganze in Köln auch Steffen gezeigt, aber im Prinzip nichts mehr davon gehört.