vielleicht mache ich es mir wieder zu einfach, aber kann ich die TStringList "retten" wenn sie mir bei zu großen Dateien auseinanderfällt
(bei array of strings kam Runtime Error 203 also Heap, bei Stringlist wahlweise 217 oder "out of memory").
Ich stelle es mir so vor, daß man in Portionen lesen, verarbeiten und dann wieder ausgeben kann. Einen guten Mischalgorithmus hätte ich dann.
Die StringList sollte mir signalisieren, bevor sie platzt und dann müßte man sich eben merken, bei welcher "Portion" man gerade war und welche Sätze des
Gesamtbestandes man gerade ist.
Dieses Signalisieren der StringList bevor sie platzt, bzw eine gute Abschätzung ob es passen könnte (zB aufgrund von Filesize und/oder der Zeilenanzahl in der Datei)
würde mir auch schon mal reichen.
Wenn ich weiß, es geht nicht alles rein, dann wähle ich eben von vornherein ein Teile-und-Herrsche-Verfahren mit Mischen, das habe ich schon.
Mir geht es nur um den Fall, wenn ich sicher gehen könnte, es paßt alles in eine StringList und ich könnte die dann mit der Standardfunktion sortieren. Ob es schneller
wird als meine eigene Routine für diesen Spezialfall ("alles in einer Liste"), werde ich dann ja sehen.
Zur Erklärung, was ich eigentlich vorhaben bzw teste:
Ich möchte Textdateien sortieren, die können auch sehr groß werden. Derzeit lese ich sie per READLN und schreibe per WRITELN,
das Sortieren im Speicher (ich benutze statt eines Arrays eine Liste), das TEILE-UND-HERRSCHE und das Mischen anschließend habe ich gelöst und die scheinen auch effizient, nur sind eben das READLN und WRITELN der Flaschenhals.
Ich experimentiere derzeit mit Array, auch dynamisches Array, jetzt StringList und zum Einlesen habe ich auch schon BlockRead und BlockWrite benutzt, mit mäßigem Erfolg. Wenn das LoadFromFile in die StringList schneller sein würde und ich eine abfangbare Meldung bekomme. bevor die StringList platzt. würde ich dem noch mal eine Chance geben. Allerdings hatte ich nach meiner Erinnerung damals schon festgestellt, daß die Sortierungen der Collections in Pascal ebenso wie in Python nicht so wahnsinnig schneller wären als mein eigenes Listenquicksort, von C-Dialekten ganz zu schweigen, die waren am langsamsten. Und wie gesagt, ich habe ein TEILE-UND-HERRSCHE Verfahren, wo ich die StringList nur dann einbauen würde, wenn sie neben einfacher und übersichtlicher (natürlich) aber auch schneller als mein eigenes wird, sonst lasse ich den Aufwand sein
Gruß Bernd
Code: Alles auswählen
program sortieren_batch;
{$mode delphi}
uses
Windows, Messages, SysUtils, Classes;
const eingabe : string = 'test.txt';
ausgabe : string = 'sort.txt';
var
datei : TStringList;
function myCompare(liste: TStringList; i1, i2: longint):longint;
var
r, i, l, l1, l2: longint;
c1, c2: byte;
s1, s2: String;
begin
s1:= liste[i1]; s2:= liste[i2];
l1:= Length(s1); l2:= Length(s2);
i:= 1; r:= 0;
l:= l1; if l > l2 then l:= l2;
while (r = 0) and (i <= l) do begin
c1:= ORD(s1[i]); c2:= ORD(s2[i]);
if c1 < c2 then r:= -1 else
if c1 > c2 then r:= 1;
inc(i);
end;
if r = 0 then begin
if l1 < l2 then r:= -1 else
if l1 > l2 then r:= 1;
end;
Result:= r;
end;
begin
if paramstr(1)<>'' then eingabe:=paramstr(1);
if paramstr(2)<>'' then ausgabe:=paramstr(2);
datei:=TStringList.Create;
datei.LoadFromFile(eingabe);
datei.Customsort(myCompare);
datei.SaveToFile(ausgabe);
end.