Возможно ли уменьшить потребление оперативной памяти при использовании Selenium GeckoDriver и Firefox
Я использую веб-драйвер Selenium и Firefox с python для очистки данных с веб-сайта.
Но в коде мне нужно получить доступ к этому веб-сайту более 10 тысяч раз, и для этого требуется много оперативной памяти.
Обычно, когда скрипт обращается к этому сайту 2500 раз, он уже использует 4 ГБ или больше оперативной памяти и перестает работать.
Можно ли уменьшить потребление оперативной памяти без закрытия сеанса браузера?
Я спрашиваю об этом, потому что, когда я запускаю скрипт, мне нужно вручную войти на сайт (двухфакторная аутентификация, код не показан ниже), и если я закрою сеанс браузера, мне нужно будет снова войти на сайт.
for itemLista in lista:
driver.get("https://mytest.site.com/query/option?opt="+str(itemLista))
isActivated = driver.find_element_by_xpath('//div/table//tr[2]//td[1]')
activationDate = driver.find_element_by_xpath('//div/table//tr[2]//td[2]')
print(str(isActivated.text))
print(str(activationDate.text))
indice+=1
print("numero: "+str(indice))
file2.write(itemLista+" "+str(isActivated.text)+" "+str(activationDate.text)+"\n")
#close file
file2.close()
3 ответа
Я узнаю, как избежать утечки памяти.
Я просто использую
time.sleep(2)
после
file2.write(itemLista+" "+str(isActivated.text)+" "+str(activationDate.text)+"\n")
Теперь Firefox работает без много оперативной памяти
Это просто идеально.
Я не знаю точно, почему он остановился, потребляет так много памяти, но я думаю, что это растущее потребление памяти, потому что у него не было времени, чтобы завершить каждый запрос driver.get.
Из вашего вопроса о пунктах списка в lista не ясно, чтобы проверить фактический URL / веб-сайт.
Однако может оказаться невозможным снизить потребление ОЗУ при доступе к веб-сайту более 10 000 раз подряд с помощью подхода, который вы адаптировали.
Решение
Как вы упомянули, когда скрипт обращается к этому сайту 2500 раз или около того, он уже потребляет 4 ГБ или больше оперативной памяти и перестает работать, вы можете заставить счетчик обращаться к сайту 2000 раз в цикле и заново инициализировать WebDriver и Web Browser после ссылающееся driver.quit()
в tearDown(){}
метод изящного закрытия и уничтожения существующих экземпляров WebDriver и Web Client:
driver.quit() // Python
Вы можете найти подробное обсуждение в PhantomJS, веб-драйвер остается в памяти
В случае если процессы GeckoDriver и Firefox все еще не уничтожены и не удалены, вам может потребоваться убить процессы из списка задач.
Решение Python (кроссплатформенное):
import os import psutil PROCNAME = "geckodriver" # or chromedriver or iedriverserver for proc in psutil.process_iter(): # check whether the process name matches if proc.name() == PROCNAME: proc.kill()
Вы можете найти подробное обсуждение в Selenium: как остановить процесс geckodriver, влияющий на память ПК, без вызова driver.quit()?
Как упоминалось в моем комментарии, открывайте и записывайте в свой файл только на каждой итерации, а не оставляйте его открытым в памяти:
# remove the line file2 = open(...) from your code
for itemLista in lista:
driver.get("https://mytest.site.com/query/option?opt="+str(itemLista))
isActivated = driver.find_element_by_xpath('//div/table//tr[2]//td[1]')
activationDate = driver.find_element_by_xpath('//div/table//tr[2]//td[2]')
print(str(isActivated.text))
print(str(activationDate.text))
indice+=1
print("numero: "+str(indice))
with open("your file path here", "w") as file2:
file2.write(itemLista+" "+str(isActivated.text)+" "+str(activationDate.text)+"\n")
В то время как selenium
это зверь, жаждущий памяти, он не обязательно убивает вашу оперативную память с каждой растущей итерацией. Однако ваш растущий открытый буфер file2
действительно занимает оперативную память, чем больше вы пишете в нее. Только когда он закрыт, он освободит виртуальную память и запишет физическую.