Задать вопрос
kshnkvn
@kshnkvn
yay ✌️ t.me/kshnkvn

Как быстрее всего можно перебрать txt файл?

Исходный файл: 7,748,982 строк со ссылками
Файл с отработанными ссылками: 3,955,464 строк со ссылками
Задача: удалить отработанные ссылки из исходного.
На данный момент все это выглядит так:
with open('nohup.txt', 'r', encoding='utf-8') as nh:
    nohup = nh.read().split('\n')
    with open("lots.txt", "r", encoding='utf-8') as ls:
        lots = ls.read().split('\n')
        for url in nohup:
            lots.remove(url)
        with open("upd_lots.txt", "w") as ul:
            for lot in lots:        
                ul.write(lot + '\n')

Т.е. я целиком загружаю оба файла в список, затем циклом прохожусь по списку отработанных ссылок и удаляю их из общего списка, после чего записываю все это в новый файл.
При тестовом запуске скорость удаления составляла ~6000 строк в минуту, т.е. такое решение в один поток будет отрабатывать около 10 часов. Да, я могу запустить 10-20-50 потоков и значительно ускорить обработку, но все-же хочется узнать есть-ли более быстрое решение моей задачи помимо разгона методом добавления новых потоков?
  • Вопрос задан
  • 135 просмотров
Подписаться 1 Простой 4 комментария
Решения вопроса 1
@deliro
7.8кк ссылок во множестве — это чуть больше 1гб:

In [1]: s = {f"https://something.asdfqwerasdfasfgqwefasdfasdf/{i}" for i in range(7748982)}                             

In [2]: import sys                                                                                                      

In [3]: sys.getsizeof(s)                                                                                                
Out[3]: 268435680

In [4]: sum(sys.getsizeof(x) for x in s)                                                                                
Out[4]: 797034036


Из первого файла читаешь множество ссылок:

all_urls = set(open("lots.txt").read().splitlines())


Так же читаешь то, что уже сделано:

done = set(open('nohup.txt').read().splitlines())

Пишешь разницу в файл:

with open("upd_lots.txt", "w") as ul:
    for url in all_urls - done:
        ul.write(url + '\n')


На всё надо не более 3гб оперативки
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы