Jeśli wyniki fałszywie dodatnie są akceptowalne, jednym z możliwych rozwiązań byłoby użycie bloom filter. Filtry Bloom są podobne do tabel mieszających, ale zamiast używać jednej wartości mieszania w celu indeksowania tabeli zasobników, używa ona wielu skrótów do indeksowania tablicy bitowej. Bity odpowiadające tym indeksom są ustawione. Następnie, aby sprawdzić, czy łańcuch jest w filtrze, ciąg jest ponownie mieszany, a jeśli ustawione są odpowiednie indeksy, to łańcuch jest "w" filtrze.
Nie przechowuje żadnych informacji na temat ciągów, więc wykorzystuje bardzo mało pamięci - ale jeśli występuje kolizja między dwoma ciągami, nie jest możliwa żadna rozdzielczość kolizji. Oznacza to, że mogą występować fałszywe alarmy (ponieważ łańcuch nie znajdujący się w filtrze może mieszać się z tymi samymi indeksami co ciąg znaków w filtrze). Jednak nie może być żadnych fałszywych negatywów; dowolny ciąg, który naprawdę jest w zestawie, zostanie znaleziony w filtrze bloom.
Istnieje fewPythonimplementations. Nietrudno też przetasować własne; Przypominam sobie, że raz zakodowałem szybko i nieczytelnie filtr kwitnienia, który działał całkiem dobrze.
Czy można tolerować sporadyczne fałszywe pozytywne? – senderle
Fałszywe negatywy są niedopuszczalne; okazjonalnie fałszywie dodatnie są potencjalnie znośne. –
Po prostu przechowuj je wszystkie w "zestawie" i pozwól, aby strona zarządzania pamięcią wirtualną systemu operacyjnego była na dysku w razie potrzeby. Możesz także jawnie zapisać go na dysku używając 'pickle'. Nie ma potrzeby tworzenia bazy danych. – martineau