Wenn False Positives akzeptabel sind, dann wäre eine mögliche Lösung die Verwendung eines bloom filter. Bloom-Filter sind Hash-Tabellen ähnlich, aber anstatt einen Hash-Wert zum Indizieren einer Bucket-Tabelle zu verwenden, verwendet sie mehrere Hashes, um ein Bit-Array zu indizieren. Die diesen Indizes entsprechenden Bits sind gesetzt. Um zu testen, ob sich eine Zeichenfolge im Filter befindet, wird die Zeichenfolge erneut gehasht. Wenn die entsprechenden Indizes festgelegt sind, befindet sich die Zeichenfolge im Filter.
Es speichert keine Informationen über die Zeichenfolgen, so dass es sehr wenig Speicher verwendet - aber wenn es eine Kollision zwischen zwei Zeichenfolgen gibt, ist keine Kollisionsauflösung möglich. Dies bedeutet, dass es möglicherweise falsche positive Ergebnisse gibt (weil eine Zeichenfolge, die nicht im Filter enthalten ist, auf dieselben Indizes wie eine Zeichenfolge im Filter hasht). Es kann jedoch keine falschen Negative geben; Jede Zeichenfolge, die wirklich in der Menge enthalten ist, wird im Bloom-Filter gefunden.
Es gibt eine fewPythonimplementations. Es ist auch nicht schwer, dein eigenes zu rollen; Ich erinnere mich daran, dass ich selbst einen schnell verdammten Bloom-Filter programmiert habe, indem ich bitarray
s verwendet habe, die ziemlich gut gelaufen sind.
Können Sie gelegentlich falsch positive Ergebnisse tolerieren? – senderle
Falsche Negative sind nicht akzeptabel; gelegentliche Fehlalarme sind potentiell tolerierbar. –
Speichern Sie sie alle in einem 'set' und lassen Sie den virtuellen Speichermanager des Betriebssystems auf die Festplatte verschieben, falls erforderlich. Sie können es auch explizit mit 'pickle' auf Festplatte speichern. Keine Notwendigkeit, eine Datenbank zu erstellen. – martineau