Mój pająk ma poważny wyciek pamięci. Po 15 minutach działa jego pamięć 5 gb i scrapy mówi (używając prefs()), że 900k żąda obiektów i to wszystko. Jaki może być powód tak dużej liczby obiektów życiowych? Żądanie wzrasta i robi się coraz mniej. Wszystkie inne obiekty są bliskie zeru.Przeciek pamięci pająka Scrapy
Mój pająk wygląda następująco:
class ExternalLinkSpider(CrawlSpider):
name = 'external_link_spider'
allowed_domains = ['']
start_urls = ['']
rules = (Rule(LxmlLinkExtractor(allow=()), callback='parse_obj', follow=True),)
def parse_obj(self, response):
if not isinstance(response, HtmlResponse):
return
for link in LxmlLinkExtractor(allow=(), deny=self.allowed_domains).extract_links(response):
if not link.nofollow:
yield LinkCrawlItem(domain=link.url)
Tutaj wyjście preferencjach()
HtmlResponse 2 oldest: 0s ago
ExternalLinkSpider 1 oldest: 3285s ago
LinkCrawlItem 2 oldest: 0s ago
Request 1663405 oldest: 3284s ago
Pamięć 100k ociera stron może trafić znak 40GB na niektórych stronach (na przykład co to victorinox.com osiągnąć 35 GB pamięci na 100k stron zeskrobanych stron). Na innych jest znacznie mniej.
UPD.
Po trzecie - mój kod jest ograniczony do jednej domeny. Ale domena może być dowolna. Im ustawienie pozwala domenom dynamicznie, więc jestem chwytając tylko jedną domenę na raz. Jeśli chodzi o ciasteczka - dobrze. Stała kolejka - powiedziałem w grupie użytkowników scrapy, że są bardzo powolni z dużą liczbą żądań, więc nie jest to opcja :( – Aldarund
OK, to nie było pokazane w twoim kodzie, dlatego wspominałem o tym! jest powolny i wydaje mi się, że jest on przeznaczony raczej do wstrzymywania/wznawiania kolejek, różnica prędkości naprawdę jest pamięcią w porównaniu z dyskiem w tej instancji – Rejected
Ustawiłem nawet kolejkę FifoMemoryQueue, ale wciąż najstarszy obiekt żądania jest prawie tak stary jak pająk obiekt powinien być przetwarzany i zwalniany? – Aldarund