![]() |
Große Datei sortieren ohne komplett in den Speicher zu laden
Hallo,
Ich suche eine Möglichkeit in Delphi eine relativ große (Text-)Datei möglichst schnell alphanumerisch zu sortieren, ohne diese komplett in den Speicher zu laden. Es gibt einige Tools, die das können, z.B die sort.exe, die auf jeden Unix basierten System gibt. Diese Datei ist zwar nicht die schnellste, aber sie schafft es beliebig große Dateien zu sortieren, ohne dabei (zu)viel Speicher zu verbrauchen. Eine Möglichkeit wäre, die Datei blockweise zu lesen, aber wie kann man diese dann noch komplett sortieren, wenn man keinen Zugriff auf jede Zeile hat? Kann mir jemand einen Tipp geben, wie man sowas machen könnte? Gruß |
Re: Große Datei sortieren ohne komplett in den Speicher zu l
Die meisten Sortierverfahren vergleichen benachbarte Blöcke. Das sollte also per Buffer lösbar sein.
|
Re: Große Datei sortieren ohne komplett in den Speicher zu l
Zitat:
Kann mir vielleicht jemand ein ganz kleines Beispiel oder so dazu schreiben, damit mir das Prinzip klar wird? Danke! |
Re: Große Datei sortieren ohne komplett in den Speicher zu l
Hallo,
schau mal bitte dort: ![]() |
Re: Große Datei sortieren ohne komplett in den Speicher zu l
Zitat:
|
Re: Große Datei sortieren ohne komplett in den Speicher zu l
wenn es nicht unbedingt schnell sein muß, dann z.B. per TPartialTextfile
oder wenn die datei z.B. aufsteigend sortiert werden soll: man könnte auch die Datei durchgehn sich einen Index aller Zeilen anlegen (also wie diese beginnen) loop: dann die Datei nochmals duchgehn sich ein array mit den "kleinsten" Zeilen anlegen (also mit deren Index + Inhalt) dann zeile für zeile weitergehn (anhand dr Indexe) und jeweils in dem array "größere" durch "kleinere" Zeilen ersetzen hat am Ende der Datei eine Hand voll der "kleinsten" Zeilen schreibt diese Zeilen in eine neue Datei und löscht deren Indexe aus der Liste und noch geht man wieder zu loop und macht mit den restlichen Zeilen weiter [add] oder halt ala RadixSort einen Index (mit den Zeilenanfängen) anlegen, dann diesen sortieren und am ende eine neue Datei anhand der sortierten Indexliste erstellen. |
Re: Große Datei sortieren ohne komplett in den Speicher zu l
Du kannst die Datei zerteilen, die Teile sortieren und dann wieder mergen ;)
|
Re: Große Datei sortieren ohne komplett in den Speicher zu l
Hallo,
Zitat:
Na, zum Mergen könnte man dann auch die einzelnen Teile parallel von der Platte lesen und in eine neue Datei schreiben, man liest die einzelnen Teile solange, bis der aktuelle Satz einer anderen Datei kleiner als der eigene ist. Das kann man über (fast) beliebig viele Dateien machen. Der Programmieraufwand dürfte nicht mal übermäßig groß sein. Wie groß sind die zu sortierenden Dateien den überhaupt? |
Re: Große Datei sortieren ohne komplett in den Speicher zu l
hallo K6n,
da gibt es was für Dich, ich glaube es heißt mergesort. Ggf. müßtest Du unter externe Sortierverfahren suchen. Das Prinzip stammt noch aus der Großrechnerzeit. Im Prinzip funktioniert das in zwei Schritten: A) lese Eingabedatei solange Datensatze sortiert vorliegen in Ausgabedatei schreiben. wenn nicht mehr sortiert dann neue Ausgabedatei anlegen. B) lies den ersten Datensatz aus allen Ausgabedateien vergleiche alle Sätze und schreibe den kleinsten in die Pufferdatei bis alle Ausgabedateien gelesen sind verarbeite die Pufferdatei mit A) wenn nur noch eine Ausgabedatei vorliegt ist alles sortiert. Wenn Dein Verfahren stabil sein soll dann mußt Du beim Wegschreiben der "kleinsten Sätze" den mit dem kleineren Index bevorzugen. Du kannst das Verfahren beschleunigen indem Du möglichst große Happen vorsortierst. Dann solltest Du allerdings auch hier ein stabiles Verfahren nutzen, also Finger weg von QuickSort. In der ursprünglichen Version wird nur mit 2 Ausgabedateien gearbeitet. Dann wird immer hin und her geschaltet wenn die Sortierung unterbrochen wird. Das fördert allerdings die Schreib/Lesetätigkeit auf der Platte. Ich hoffe das hilft Dir weiter K-H (ich bin zu langsam!) |
Re: Große Datei sortieren ohne komplett in den Speicher zu l
Vielen Dank erstmal an alle! :thumb: Ich probiere mal ein bisschen rum, auch wenn ich befürchte, dass es nichts wird. :cyclops:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:05 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