2 Stimmen

Wie kann man am schnellsten eine große Menge eindeutiger Zeichenfolgen speichern?

Ich frage mich, was ist der beste Weg für die Speicherung großer Mengen von Zeichenfolgen und die Überprüfung auf Duplikation.

Wir müssen über unsere Prioritäten nachdenken:

  • Geschwindigkeit der Duplikatsprüfung
  • Einfügen einer neuen Zeichenkette Zeit
  • Speicherplatz auf der Festplatte
  • zufällige Zugriffszeit

Was ist die beste Lösung, wenn unser Ziel die schnelle Überprüfung von Duplikaten und das Einfügen neuer Zeichenketten ist (kein zufälliger Zugriff oder Speicherplatz wichtig)? Ich denke an eine SQL-Datenbank, aber welche DB ist für diese Lösung am besten geeignet? Wenn wir eine SQL-DB wie MySQL verwenden, welche Speicher-Engine ist dann die beste? (natürlich müssen wir den Speicher wegen der Datenmenge ausschließen)

5voto

Preet Kukreti Punkte 8257

Verwenden Sie eine Hash-Funktion für die Eingabezeichenfolge. Der ausgegebene Hash wäre der Primärschlüssel/die ID des Datensatzes.

Dann können Sie prüfen, ob die DB diesen Hash/id/Primärschlüssel hat:

  • Wenn nicht, handelt es sich um eine neue Zeichenfolge; Sie fügen einen neuen Datensatz hinzu, der die Zeichenfolge und den Hash als id enthält.
  • Falls ja: Prüfen Sie, ob die Zeichenfolge des geladenen Datensatzes mit der Eingabezeichenfolge übereinstimmt.
    • wenn die Zeichenkette dieselbe ist: es handelt sich um ein Duplikat
    • wenn die Zeichenfolge unterschiedlich ist: dies ist eine Kollision. Verwenden Sie eine Kollisionsauflösung Schema zu lösen. (Nachstehend ein paar Beispiele)

Sie müssen abwägen, welche Hash-Funktion/welches Schema/welche Hash-Stärke Sie verwenden wollen, je nach Geschwindigkeit und erwarteter Anzahl von Zeichenfolgen und Anforderungen/Garantien für Hash-Kollisionen.

Es gibt mehrere Möglichkeiten, Kollisionen aufzulösen:

  • Verwenden Sie eine 2. Hash-Funktion, um einen neuen Hash in derselben Tabelle zu erstellen.
  • Markieren Sie den Datensatz (z. B. mit NULL) und wiederholen Sie den Vorgang mit einer stärkeren zweiten Hash-Funktion (mit größerem Bereich) in einer sekundären "Kollisions"-Tabelle. Wenn die Zeichenfolge bei der Abfrage als kollidiert markiert wird (z. B. mit NULL), führen Sie die Suche in der Kollisionstabelle erneut durch. Sie können auch Folgendes verwenden dynamisches perfektes Hashing um sicherzustellen, dass es bei dieser zweiten Tabelle nicht zu weiteren Kollisionen kommt.

Je nachdem, wie beständig dies sein muss und wie viel Speicherplatz Sie voraussichtlich benötigen bzw. wie viele Zeichenketten Sie benötigen, könnten Sie dies natürlich auch ohne Datenbank direkt im Speicher durchführen, was wesentlich schneller wäre.

4voto

user799188 Punkte 13057

Vielleicht sollten Sie eine NoSQL-Lösung in Betracht ziehen:

Redis . Einige der Anwendungsfälle, die mit Redis gelöst wurden:

memcached . Einige Vergleiche zwischen memcached und Redis:

Datenbank/Couchbase der OMGPOPs Draw Something zu den eine ihrer Erfolgsgeschichten . Vergleich zwischen Redis und Membase:

Einige Fragen:

  • Wie groß ist die Menge der Strings?
  • Ist die Anwendung eher lese- oder schreibintensiv oder beides?
  • Wie oft sollen die Daten auf der Festplatte gespeichert werden?
  • gibt es eine N letzte Zeichenketten Anforderung?

Ich hoffe, das hilft.

1voto

rush00121 Punkte 185

Erzeugen von Suffixbäumen zur Speicherung von Zeichenketten . Ukkonen's Algorithmus wie in http://www.daimi.au.dk/~mailund/folien/Ukkonen-2005.pdf gibt einen Einblick, wie man einen Suffix-Baum erstellt. Es gibt verschiedene Möglichkeiten, diesen Suffix-Baum zu speichern. Aber einmal erstellt, ist die Suchzeit sehr gering.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X