2 Stimmen

Python für die Indizierung und Suche in einem Cluster?

Nach einem unglücklichen Missgeschick mit MySQL habe ich es schließlich aufgegeben, es zu benutzen.

Was ich habe?

Große Menge von Dateien im folgenden Format:

ID1: String String String String
ID2: String String String String
ID3: String String String String
ID4: String String String String

Was ich getan habe?

Ich habe MySQL auf einem leistungsstarken Rechner verwendet, um alles in eine Datenbank in der folgenden Form zu importieren:

ID1 String
ID1 String
ID1 String
ID1 String
...
...

Was ist passiert?

Der Datenbankimport war erfolgreich. Die Indizierung schlägt fehl, weil sie offenbar mehr als 200 GB für 2 Milliarden Datensätze benötigt. Eine vernünftige Forderung, aber ich habe einfach nicht so viel Platz, denn die Tabelle selbst belegt nach der Normalisierung etwa 240 GB.

Was ich zu tun gedenke?

Ich habe einen Cluster von 20 Knoten mit etwa 80 GB Zugriff für alle zusammen (alle haben einen NFS-Mount). Ich habe die Knoten für verteiltes Rechnen eingerichtet, indem ich Parallele Python . Ich plane, meine Logik umzuschreiben, um die Leistung des Clusters zu nutzen.

Meine Frage:

Ich muss viele der folgenden Arten von Suchvorgängen durchführen:

Welche IDs enthalten eine bestimmte Zeichenfolge?

Nehmen wir zum Beispiel eine beliebige Zeichenkette: "String1", muss ich wissen, dass sie in "ID1, ID2234" enthalten ist.

Ich kenne im Moment zwei Methoden:

  • Mit python grep aufrufen
  • Jede der 20 Knoten übernimmt die Kontrolle über eine Reihe von Dateien und sucht bei einer Suchanfrage durchsucht die zugehörigen Dateien.

Kann jemand einen guten Ansatz vorschlagen, um diese ansonsten ineffiziente Aufgabe zu beschleunigen?

1voto

Don O'Donnell Punkte 4320

Für die Anforderung, nachzusehen, welche IDs mit einer bestimmten Zeichenkette verbunden sind, schlage ich vor, die ID/String-Beziehung umzukehren, so dass die Datensätze durch eindeutige Zeichenketten verschlüsselt werden und die zugehörigen Daten eine Folge von IDs sind. Eine Zeichenkettensuche kann entweder durch eine binäre Suche, falls sortiert, oder durch einen Hash-Algorithmus implementiert werden. Dies kann Ihre Daten erheblich verdichten, wenn sich viele gleiche Zeichenketten wiederholen.

0voto

SamStephens Punkte 5593

Ich würde vorschlagen, die Verwendung einer nicht-relationalen Datenbank zu prüfen, um dies zu unterstützen. Es gibt eine Reihe von Key/Value-Speichern, die Sie für die Speicherung Ihrer Daten in Betracht ziehen könnten und die effizienter sein sollten als eine Datenbank. Sie sollten sich Folgendes ansehen NoSQL auf Wikipedia um damit zu beginnen.

EDIT。 Verwenden Sie möglichst kompakte Datentypen für die Daten in Ihrer Datenbank? Handelt es sich bei den IDs um Ganzzahlen mit der kleinstmöglichen Größe, um den ID-Bereich zu speichern? Wenn Ihre Strings ASCII sind, speichern Sie sie als ASCII-Strings und nicht als Unicode (VARCHAR und nicht NVARCHAR)?

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