AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Große Text Datei sortieren + doppelte Einträge löschen
Thema durchsuchen
Ansicht
Themen-Optionen

Große Text Datei sortieren + doppelte Einträge löschen

Ein Thema von Win32.API · begonnen am 18. Dez 2005 · letzter Beitrag vom 18. Dez 2005
Antwort Antwort
Win32.API

Registriert seit: 23. Mai 2005
312 Beiträge
 
#1

Große Text Datei sortieren + doppelte Einträge löschen

  Alt 18. Dez 2005, 19:00
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
  Mit Zitat antworten Zitat
Benutzerbild von Delphi-Freak
Delphi-Freak

Registriert seit: 26. Sep 2004
Ort: Wien Nähe (Österreich)
321 Beiträge
 
Delphi 2006 Architect
 
#2

Re: Große Text Datei sortieren + doppelte Einträge löschen

  Alt 18. Dez 2005, 19:04
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
Gerhard Pfister
*
»To him who loves us and has freed us from our sins by his blood [...] be glory and power for ever and ever! Amen.« (Revelation*1,*5?6)
  Mit Zitat antworten Zitat
Win32.API

Registriert seit: 23. Mai 2005
312 Beiträge
 
#3

Re: Große Text Datei sortieren + doppelte Einträge löschen

  Alt 18. Dez 2005, 19:09
Hi,
Ich meine damit Zeilen, wieviele Zeilen es genau sind kann ich nicht sagen ,
da ich diese Datei in keinem Programm öffnen kann
greetz
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#4

Re: Große Text Datei sortieren + doppelte Einträge löschen

  Alt 18. Dez 2005, 19:19
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
  Mit Zitat antworten Zitat
Benutzerbild von Delphi-Freak
Delphi-Freak

Registriert seit: 26. Sep 2004
Ort: Wien Nähe (Österreich)
321 Beiträge
 
Delphi 2006 Architect
 
#5

Re: Große Text Datei sortieren + doppelte Einträge löschen

  Alt 18. Dez 2005, 19:28
Schon jemand schneller
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
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
Gerhard Pfister
*
»To him who loves us and has freed us from our sins by his blood [...] be glory and power for ever and ever! Amen.« (Revelation*1,*5?6)
  Mit Zitat antworten Zitat
Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#6

Re: Große Text Datei sortieren + doppelte Einträge löschen

  Alt 18. Dez 2005, 19:47
Zitat von Delphi-Freak:
Frage noch an den Unwissenden, der seinem Namen irgenwie nicht ganz treu bleibt
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?
Ach, meine Name passt schon zu mir.

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

[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]
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: Große Text Datei sortieren + doppelte Einträge löschen

  Alt 18. Dez 2005, 20:40
Hier, im DF hatte Jemand das gleiche Problem.
http://www.delphi-forum.de/viewtopic...718&highlight=
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:07 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz