In der Vergangenheit musste ich mit großen Dateien arbeiten, irgendwo in der 0,1-3GB-Bereich. Es wurden nicht alle 'Spalten' benötigt, daher war es in Ordnung, die restlichen Daten in den RAM zu schreiben. Jetzt muss ich mit Dateien in 1-20GB Bereich arbeiten, und sie werden wahrscheinlich wachsen, wie die Zeit vergeht. Das ist völlig anders, weil Sie die Daten nicht mehr in den Arbeitsspeicher laden können.Sortieren von 20 GB Daten
Meine Datei enthält mehrere Millionen Einträge (ich habe eine mit 30 mil Einträge gefunden). Bei der Eingabe besteht in etwa 10 'Spalten': eine Zeichenfolge (50-1000 Unicode-Zeichen) und mehrere Zahlen. Ich muss die Daten nach 'Spalte' sortieren und anzeigen. Für den Benutzer sind nur die oberen Einträge (1-30%) relevant, der Rest sind Daten niedriger Qualität.
Also brauche ich ein paar Vorschläge darüber, in welche Richtung ich gehen soll. Ich möchte definitiv keine Daten in einer Datenbank ablegen, da sie schwer zu installieren und für Nicht-Computer-versierte Personen zu konfigurieren sind. Ich liefere gerne ein monolithisches Programm.
Das Anzeigen der Daten ist überhaupt nicht schwierig. Aber das Sortieren ... ohne die Daten im RAM zu laden, auf normalen PCs (2-6GB RAM) ... wird einige gute Stunden bringen.
Ich war ein wenig in MMF suchen (Memory Mapped-Dateien), aber in diesem Artikel von Danny Thorpe zeigt, dass es nicht geeignet sein kann: http://dannythorpe.com/2004/03/19/the-hidden-costs-of-memory-mapped-files/
Also, ich war über das Laden denken nur die Daten aus der Spalte, die in RAM und einem Zeiger auf die Adresse (in die Datei) des "Eintrags" sortiert werden muss. Ich sortiere die 'Spalte', dann benutze ich den Zeiger, um den Eintrag zu finden, der jeder Spaltenzelle entspricht, und stelle den Eintrag wieder her. Die 'Wiederherstellung' wird direkt auf die Festplatte geschrieben, so dass kein zusätzlicher Arbeitsspeicher benötigt wird.
PS: Ich bin auf der Suche nach einer Lösung, die sowohl auf Lazarus als auch auf Delphi funktioniert, weil Lazarus (eigentlich FPC) 64-Bit-Unterstützung für Mac hat. 64 Bit bedeutet mehr RAM verfügbar = schnellere Sortierung.
Obwohl es nicht Delphi-spezifisch ist, gibt es hier Dutzende von Posts zum Sortieren großer Textdateien. Suchen Sie nach 'sort large files' und sehen Sie sich die Ergebnisse an. Es gibt Links zu verschiedenen Techniken dafür, wie zum Beispiel die im ersten Ergebnis (http://stackoverflow.com/q/7918060). Wie gesagt, Ihre Frage ist sehr weit gefasst und ich bin mir nicht sicher, ob sie hier ohne Beispieldaten konkret beantwortet werden kann. –
Wenn Sie Ihre eigenen schreiben möchten, kann ich einen alten Mergesort-Code von einer Backup-CD ausgraben und irgendwo hochladen. Es ist jedoch DOS-Befehlszeilenmaterial. –
@ JanDoggen-Es spielt keine Rolle, es ist die Befehlszeile. Ich brauche es sowieso ohne GUI. Bereits gemachter Code ist immer willkommen. Danke vielmals. – Ampere