![]() |
Große Text Datei sortieren + doppelte Einträge löschen
Hi,
ich möchte eine große(750 MB) txt Datei sortieren und doppelte einträge löschen. Ich habe es bereits mit einer TStringlist ausprobiert, dort bekomme ich immer einen Out of Memory Error :/ Wenn ich versuche die Datei in eine Memo zuladen bekomme ich auch diesem Fehler :( Danke und greetz |
Re: Große Text Datei sortieren + doppelte Einträge löschen
Der Fehler beim Memo ist ganz klar, da dies ja eigentlich auf einer TStringList basiert.
Du sprichst von Einträgen, was verstehst du darunter? LG, ich |
Re: Große Text Datei sortieren + doppelte Einträge löschen
Hi,
Ich meine damit Zeilen, wieviele Zeilen es genau sind kann ich nicht sagen , da ich diese Datei in keinem Programm öffnen kann :shock: greetz |
Re: Große Text Datei sortieren + doppelte Einträge löschen
Hi,
wie ich glaube alzaimar erst neulich in einem Thread schon richtig sagte, wenn du große Datenmengen hast, solltest du den Mergesort benutzen. Versuch einfach erst garnicht, dieses File komplett in den Speicher zu laden sondern nur kleine Teile. Die kannst du dann ganz gemütlich sortieren und hast für diese Teilstücke immer schon eine Sortierung. Musst halt nur gucken, dass du sinnvoll aus der Datei liest. Beim Sortieren (musst beim mergen ja gucken, welcher Wert zuerst kommt) kannst du dann auch doppelte Werte einfach wegfallen lassen. Zum einlesen musst du dann eher mit einem z.B. FileStream arbeiten und selbst gucken, wo ein String endet (es sei denn du hast z.B. feste Zeilenlängen). Damit solltest du es hinbekommen (achtung, musst den Mergesort wahrscheinlich ein wenig anpassen, auch der wird meistens so geschrieben, dass alle Daten im Speicher gehalten werden). Gruß Der Unwissende |
Re: Große Text Datei sortieren + doppelte Einträge löschen
Schon jemand schneller :zwinker:
Ich poste aber trotzdem, vlt. steht ja noch was hilfreiches drin: Ich würde die Datei mit einem Stream öffnen, und dann immer wieder eine bestimmte Anzahl Zeichen auslesen (z. B. 1024) und diese dann "parsen", sprich Zeichen für Zeichen durchlaufen und nach einem Zeilenumbruch (#$OD #$OA) das dann in ein Array - wenn es funktioniert, ich weiß leider nicht wie groß ein Array maximal sein kann - hinzufügen, sofern der Wert noch nicht enthalten ist. Wird aber sicher nicht sehr leicht sein und außerdem langsam sein... Frage noch an den Unwissenden, der seinem Namen irgenwie nicht ganz treu bleibt :wink: wie meinst du, einen Teil nach dem anderen sortieren, dann hast du ja z. B. wenn du HAEDFCBG als HAED und FCBG einzeln sortierst nachher ADEHBCFG und nicht ABCDEFGH? LG, ich |
Re: Große Text Datei sortieren + doppelte Einträge löschen
Zitat:
Hab es glaube ich nur nicht weit genug ausformuliert, aber Mergesort macht ja eigentlich nichts anderes als zwei Teilfelder zu sortieren und dann die sortierten Teilfelder in einer neuen Sortierung zusammen zu fügen. Damit würde aus HAED -> ADEH und aus FCBG -> BCFG werden, dann schaut man ist A < B, D < B, D < C, ... und fügt immer das kleinere in die resultierende Liste ein. Und im Prinzip würde ich es nicht viel anders machen als du. Man liest ein recht kleinen Teil aus der Datei aus, extrahiert hier die Zeilen (also nach Zeilenende) und sortiert diese Zeilen dann beliebig (also hier kann es wirklich jeder Algorithmus sein). Das ganze macht man halt mit der ganzen Datei. Nun hat man mehrere sortierte Teilfelder (die man z.B. wieder in eine Datei zurückschreiben kann). Jetzt mischt man á la Mergesort, man nimmt je zwei von den Teilsortierten Feldern jeweils eine kleine Teilmenge und schreibt die sortiert in eine neue Datei, dann den nächsten Haufen der beiden Dateien, ... Da die jeweils schon sortiert waren, klappt das auch. Allerdings darf man natürlich nicht mehr einfach den Rest eines Arrays anfügen, wenn das zweite Array leer ist (die Datei aus der die leere Datei stammt könnte noch weitere Daten enthalten, die kleiner sind als Elemente des noch nicht leeren Arrays). Hoffe ist halbwegs klar was ich meine. Was Geschwindigkeit angeht, so ist die sicherlich nicht so hoch, aber das liegt dann doch eher an den vielen Zugriffen auf die Festplatte, die sich bei solchen Datenmengen eher nicht vermeiden lässt. Gruß Der (zurecht so benannte) Unwissende :wink: [edit]Mal noch ein PS Es macht natürlich Sinn, nach dem ersten Einlesen und Sortieren die Länge der Strings zu merken und mit abzuspeichern, dann entfällt bei jedem weiteren Durchlauf das ineffiziente Suchen nach dem Zeilenende. [/edit] |
Re: Große Text Datei sortieren + doppelte Einträge löschen
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz