Раз тема пошла, разложу по памяти, почему питон здесь и падает.
Строка в питоне это объект. Пустая строка занимает под полсотни байт сама по себе, дальше плюс длина. Положили в set, добавьте ещё указатель и накладные расходы таблицы, а таблица держит запас свободных ячеек, иначе она вырождается. На практике миллион коротких строк в set обходится в двести с лишним мегабайт. Полтора миллиона длинных адресов уже под гигабайт.
Утилиты из коробки устроены иначе. sort читает кусок, который влезает в отведённую память, сортирует его, пишет во временный файл, и так по всему входу. Потом сливает временные куски. Память при этом почти не растёт, упирается всё в диск.
Если питон нужен по другим причинам, есть середина. Считайте короткую свёртку строки, восемь байт вместо полусотни, саму строку в память класть незачем.
import hashlib
vidano = set()
with open("spisok.txt", "rb") as f, open("out.txt", "wb") as o:
for s in f:
h = hashlib.blake2b(s.strip(), digest_size=8).digest()
if h not in vidano:
vidano.add(h)
o.write(s)
Память на том же миллионе падает примерно вчетверо. Не бесплатно: теоретически возможны совпадения свёрток, но на таких объёмах это событие настолько редкое, что им спокойно пренебрегают.