Frage

Ich habe speichern viele Strings in C ++ Karte eindeutige Zeichenfolgen zu halten und, wenn überhaupt String duplizieren auftritt, ich muss nur der Zähler erhöht (pair.second). Ich habe C ++ Karte verwendet und sie paßt gut zu dieser Situation. Da die Datei ist, dass die Verarbeitung nun weg bis 30gig Ich versuche, diese anstelle von Speicher in einer Datei zu halten.

Ich kam auch über trie, die in diesem Fall schneller als Karte ist. Jeder bewusst Datei gesichert Trie-Implementierung? Ich stieß auf eine Trie Implementierung ähnlich zu dem, was ich Online Suche aber nicht scheint fehlerfrei ..

zu sein
War es hilfreich?

Lösung

Wenn Sie Ihre Datei sortieren können die Zeichenketten enthalten, dann die sortierte Liste zu lesen und Duplikate zu zählen wäre leicht. (Sie können die Originaldatei beibehalten und eine neue Datei von sortierten Strings erstellen.) Sortierung große Dateien effizient alte Technik ist. Sie sollten ein Dienstprogramm für die Lage zu finden.

Wenn Sie nicht sortieren , dann erwägen, Verdauen die Saiten. MD5 kann viel des Guten für Ihre Zwecke sein. Sie können etwas nach oben schustern. Für Milliarden von Strings, können Sie 8-Byte-Digests verwenden. Verwenden Sie einen Baum (wahrscheinlich ein BST) von Digesten. Für jede verdauen, speichern Sie die Datei Offsets der einzigartigen Strings, dass Digest erzeugen.

Wenn Sie eine Zeichenfolge zu lesen, berechnen sie verdauen ist, und schauen Sie. Wenn Sie nicht den Digest finden, wissen Sie die Zeichenfolge eindeutig ist. Bewahren Sie es im Baum. Wenn Sie den Digest tun finden, überprüfen Sie jede zugehörige Saite für ein Spiel und behandeln entsprechend.

Strings vergleichen, müssen Sie in die Datei gehen, da alles, was Sie gespeichert haben die Datei-Offsets ist.

Was ist wichtig, sich daran zu erinnern, dass, wenn zwei Digests verschieden sind, die Strings, die sie hervor unterschiedlich sein müssen. Wenn die Digests gleich sind, möglicherweise nicht die Saiten gleich, so müssen Sie überprüfen. Dieser Algorithmus wird effizienter, wenn es weniger doppelte Strings sind.

Andere Tipps

Wie werden Sie 30GB in dem Speicher auf einmal laden? Und da es ein Wörterbuch-basiertes Verhalten ist, dass Sie wollen, würde ich jedes Mal vorstellen, dass Sie einfügen oder Schritt, müssen Sie die gesamte Datei laden (wenn auch Stück für Stück) für die Suche.

Ich schlage vor, eine Datenbank zu verwenden. Das ist, was sie für ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top