Шесть гигабайт из строк набрать тяжело, а вот из ссылок на разметку легко. Посмотри внимательно, что именно ложится в rezultaty. Если туда попадают объекты lxml, каждый такой элемент тянет за собой весь документ: одна ссылка держит в памяти страницу на полтора мегабайта, четыреста тысяч ссылок держат всё, что ты за ночь скачал.
Проверяется за десять минут. Ставишь два снимка памяти в разных точках прогона и смотришь разницу.
import tracemalloc
tracemalloc.start(10)
# после первой тысячи задач
snap1 = tracemalloc.take_snapshot()
# после десятой тысячи
snap2 = tracemalloc.take_snapshot()
for st in snap2.compare_to(snap1, "lineno")[:12]:
print(st)
```
Верхние строки покажут файл и номер строки, где память набирается. Если наверху вылезет lxml/etree, вопрос закрыт: приводи всё к строкам и числам прямо на разборе, дерево дальше функции жить не должно.
Словарь vidano посмотри отдельно. Четыреста тысяч ключей это ещё терпимо, но если ты кладёшь туда кусок страницы вместо короткого артикула, вот тебе и гигабайты.