Вы должны решить, что важнее: пространство или время.
Если время, то вам нужно создать уникальные представления вашего large_item
, которые занимают как можно меньше места (возможно, немного str
).значение), которое легко (то есть быстро) рассчитать и не будет иметь коллизий, и сохраните их в set
.
Если есть место, найдите самое быстрое решение на основе диска, которое вы можете, и сохраните наименьшее возможноезначение, которое будет идентифицировать large_item
.
Так или иначе, вам нужны маленькие уникальные идентификаторы - в зависимости от характера large_item
это может быть большой выигрыш или невозможен.
Обновление
это строки html-контента
Возможно, тогда это гибридное решение: сохранить set
в памяти обычного хэша Pythonсохраняя при этом фактический контент html на диске с ключами этого хэша;когда вы проверяете, находится ли текущий large_item
в set
, и получаете положительный результат, дважды проверьте решение на основе диска, чтобы увидеть, является ли это настоящим попаданием или нет, тогда пропустите или обработайте, как необходимо.Примерно так:
import dbf
on_disk = dbf.Table('/tmp/processed_items', 'hash N(17,0); value M')
index = on_disk.create_index(lambda rec: rec.hash)
fast_check = set()
def slow_check(hashed, item):
matches = on_disk.search((hashed,))
for record in matches:
if item == record.value:
return True
return False
for large_item in many_items:
hashed = hash(large_item) # only calculate once
if hashed not in fast_check or not slow_check(hashed, large_item):
on_disk.append((hashed, large_item))
fast_check.add(hashed)
process(large_item)
К вашему сведению: dbf
- это модуль, который я написал, который вы можете найти на PyPI