Ваш алгоритм может быть самым быстрым способом для этого, но, как вы заметили, это будет ограничено количеством строк, которые вы можете поместить в память. Есть несколько методов, которые смягчат эту проблему и позволят обрабатывать гораздо большие файлы.
Первый - это только чтение и запись по одной строке за раз. Нет необходимости читать кусок по 100000 за один раз, так как вы обрабатываете их по отдельности, и, конечно, нет причин держать все уникальные результаты в одной строке. Прочитайте и напишите по одной строке за раз, чтобы свести к минимуму количество отходов.
Второй заключается в замене криптографического хэша на более длинную строку. Хэш будет фиксированным размером, независимо от того, как долго длится сама строка. Если вы беспокоитесь о возможности двух строк, производящих один и тот же хэш, не будьте - с достаточно большим хэшем вероятность того, что две строки, производящие один и тот же хеш, будут меньше вероятности сбой RAM, что позволяет использовать две разные строки сравните равные, даже принимая во внимание birthday paradox.
Сочетание обоих подходов выглядит примерно так:
import hashlib
sha256 = hashlib.sha256()
alreadyseen = set()
with open("sample.txt") as file:
for line in file:
pass # do something
key = line if len(line) < 32 else sha256(line)
if key not in alreadyseen:
alreadyseen.add(key)
print(line)
Насколько большой файл? Как насчет двоичного дерева поиска (которое даст вам поиск в Log N)? Альтернативно, если строки отсортированы, вы можете повторять и помнить только предыдущую строку ...? – erewok
Если все это поместится в памяти, техника, которую вы здесь, вероятно, оптимальна. Если вы заинтересованы в методе, который работает, даже если он не подходит, просто скажите это. –
Вы уверены, что не хотите 'print (output)' вне цикла? – Eric