it-swarm.dev

Sortieralgorithmen, die mit großen Datenmengen arbeiten

Ich suche nach Sortieralgorithmen, die mit einer großen Datenmenge arbeiten können, d. H. Die auch dann funktionieren können, wenn der gesamte Datensatz nicht gleichzeitig im Hauptspeicher gespeichert werden kann.

Der einzige Kandidat, den ich bisher gefunden habe, ist die Zusammenführungssortierung: Sie können den Algorithmus so implementieren, dass er Ihren Datensatz bei jeder Zusammenführung scannt, ohne alle Daten gleichzeitig im Hauptspeicher zu halten. Die Variation der Zusammenführungssortierung, an die ich denke, wird in dieser Artikel im Abschnitt beschrieben. Verwendung mit Bandlaufwerken .

Ich denke, dies ist eine gute Lösung (mit der Komplexität O (n x log (n)), aber ich bin gespannt, ob es andere (möglicherweise schnellere) Sortieralgorithmen gibt, die mit großen Datenmengen arbeiten können, die nicht in den Hauptspeicher passen.

[~ # ~] edit [~ # ~]

Hier sind einige weitere Details, wie in den Antworten gefordert:

  • Die Daten müssen periodisch sortiert werden, z. einmal im Monat. Ich muss nicht einige Datensätze einfügen und die Daten inkrementell sortieren lassen.
  • Meine Beispieltextdatei enthält ungefähr 1 GB UTF-8-Text, aber ich wollte das Problem im Allgemeinen lösen, selbst wenn die Datei beispielsweise 20 GB groß wäre.
  • Es befindet sich nicht in einer Datenbank und kann es aufgrund anderer Einschränkungen nicht sein.
  • Die Daten werden von anderen als Textdatei ausgegeben. Ich habe meinen eigenen Code, um diese Textdatei zu lesen.
  • Das Format der Daten ist eine Textdatei: Neue Zeilenzeichen sind Datensatztrennzeichen.

Eine mögliche Verbesserung, die ich mir vorgestellt hatte, bestand darin, die Datei in Dateien aufzuteilen, die klein genug sind, um im Speicher sortiert zu werden, und schließlich alle diese Dateien mit dem oben beschriebenen Algorithmus zusammenzuführen.

12
Giorgio

Die kanonische Referenz zum Sortieren und Suchen lautet Knuth, Vol. . Beginnen Sie dort.

Das Buch wurde ursprünglich zurückgeschrieben, als Computer viel kleiner und langsamer waren als heute, was Sortiertechniken ohne Speicher wichtiger machte, als sie heute angenommen werden.

13
John R. Strohm

Externe R-Way-Zusammenführung wie im UNIX-Befehl sort ist eine gute Alternative. Aufgrund Ihrer Formulierung bin ich mir nicht sicher, ob dies der Algorithmus ist, den Sie mit "Sortierung zusammenführen" gemeint haben, und wenn Sie ihn nicht kennen, schauen Sie ihn sich an.

6
thiton

Ohne weitere Details ist "Merge Sort" wahrscheinlich die beste Antwort, die Sie erhalten. Sie können jedoch je nach Ihren Anforderungen etwas viel intelligenteres implementieren.

Können Sie beispielsweise einfach einen speicherinternen Index der Datei erstellen und dann alle Werte gleichzeitig kopieren und den Speicherort verschiedener Schlüsselwerte zwischenspeichern? Passt 1/2 sofort in den Speicher oder 1/1000000? Wenn es der zweite ist, können Sie möglicherweise keinen Index in den Speicher einfügen. Wenn der erste, können Sie beide Hälften effizienter sortieren und sie dann in einem einzigen letzten Schritt zusammenführen.

Zum Teufel, da Sie es nicht angegeben haben, ist es möglich, dass sich Ihre Daten alle in einer Datenbank befinden. Wenn ja, können Sie einfach eine Indextabelle erstellen und sie als gut bezeichnen (ich vermute, dass dies nicht der Fall ist, aber ich möchte nur darauf hinweisen Ihre Situation ist entscheidend für die Lösung eines solchen komplizierten Problems.

Wenn Sie es nur einmal tun möchten und nach einem sehr schnellen Hack suchen, klingt es so, als wäre eine externe Zusammenführungssortierung ein guter Anfang, wenn Sie Unix ausführen (da es anscheinend eingebaut ist).

Wenn Sie es in Ordnung halten müssen und immer einen einzelnen Datensatz hinzufügen, ist eine Einfügesortierung erforderlich (das Hinzufügen eines einzelnen Datensatzes zu sortierten Daten ist immer eine Einfügungssortierung).

Können Sie den Code steuern, der die Daten "liest"? Wenn ja, dann helfen viele Arten der Indizierung (anstatt durch Verschieben von Daten auf der Festplatte zu sortieren) VIEL (wird tatsächlich eine absolute Voraussetzung sein).

Damit:

  • An Ort und Stelle oder mehrere Dateien?
  • Einmalig, periodisch oder immer sortiert?
  • Wie viel größer als der Speicher (Wie viele Speicherlasten müssen durch den gesamten Datensatz übertragen werden)?
  • Ist es in einer Datenbank? Kann es sein?
  • Kontrollieren Sie den Code, der die Daten liest, oder werden andere eine Datei direkt sichern?
  • Datei Format? (Text? Feste Aufzeichnung?)
  • Gibt es noch andere besondere Umstände, nach denen ich nicht gefragt habe?
4
Bill K

Wenn Sie wirklich eine skalierbare Lösung wünschen, sollten Sie sich TeraSort ansehen, die Standard-Sortierimplementierung mit Map-Reduce. weitere Details zu StackOverflow .

3
m3th0dman

Sie könnten an einem Bucket Sort interessiert sein. Die durchschnittliche Fallleistung ist die lineare Zeit.

= O (n + d) n: Anzahl der Elemente und d = Länge der größten Anzahl, wenn Sie eine Intuition über Ihre Daten haben, dh. Wenn Sie wissen, wie viele Ziffern Ihre größte Zahl sind. Wenn Sie also 2 Millionen 6-stellige Zahlen haben => 0(n) also linear.

1
stonemetal

Verwenden Sie einen externen Zusammenführungssortieralgorithmus (wenn Ihre Daten fortlaufend sind) oder einen Bucket-Sortierung mit Zählsortierung als Implementierung der Sortierung für Buckets (wenn Ihre Daten diskret und gleichmäßig verteilt sind ).

Der wahrscheinlich beste Ansatz besteht darin, eine eigene Index-/Zuordnungsdatei zu erstellen, wenn das Inkrement klein ist.

  1. Bestellen Sie irgendwie Ihre "Datenbank"
  2. Weisen Sie jedem Eintrag eine Ganzzahl zu (1, 2, 3, 4, ..., n) (besser: Verwenden Sie einige spärliche Indizes).
  3. Wenn Sie ein Inkrement hinzufügen, suchen Sie einfach eine Lücke, in der die linke Zahl kleiner oder gleich und die rechte Zahl größer oder gleich ist (bei einer modifizierten Version einer binären Suche sollte dies nicht schwierig sein).
  4. Einfügen, während die Lücken ausreichend groß sind, wenn nicht: einfach neu indizieren (nie wieder sortieren) :-)
0
malejpavouk

Ich habe gerade einige abstrakte Strukturen namens Big Queue und Big Array erstellt, um das Sortieren und Suchen von Big Data auf einem einzelnen Computer mit begrenztem Speicher zu vereinfachen. Grundsätzlich ähnelt der verwendete Algorithmus dem oben erwähnten - externe Zusammenführungssortierung.

Ich kann 128 GB Daten (jedes Element 100 Byte) in 9 Stunden auf einem einzelnen Computer sortieren und dann die sortierten Daten fast ohne Zeitaufwand binär durchsuchen.

Here ist ein Beitrag darüber, wie man Big Data mithilfe meiner Open Source Big Queue und Big Array-Strukturen durchsucht.

0
Bulldog