2012-11-01 14 views
5

Napisałem skrypt, który przejdzie przez wszystkich klientów w naszej bazie danych, sprawdzi, czy działa adres URL witryny i spróbuje znaleźć link do twittera na swojej stronie głównej. Mamy ponad 10 000 adresów URL do zweryfikowania. Po ułamku, jeśli adresy URL zostaną zweryfikowane, zaczniemy otrzymywać błędy getaddrinfo dla każdego adresu URL.Błąd getaddrinfo z Mechanize

Oto kopia kodu, który zdrapuje pojedynczy URL:

def scrape_url(url) 
    url_found = false 
    twitter_name = nil 

    begin 
    agent = Mechanize.new do |a| 
     a.follow_meta_refresh = true 
    end 

    agent.get(normalize_url(url)) do |page| 
     url_found = true 
     twitter_name = find_twitter_name(page) 
    end 

    @err << "[#{@current_record}] SUCCESS\n" 
    rescue Exception => e 
    @err << "[#{@current_record}] ERROR (#{url}): " 
    @err << e.message 
    @err << "\n" 
    end 

    [url_found, twitter_name] 
end 

Uwaga: Ja również uruchomić wersję tego kodu, który tworzy pojedynczą instancję Mechanize, który pobiera współdzielonej przez wszystkie połączenia do scrape_url. Nie udało się dokładnie w taki sam sposób.

Gdy uruchomię to na EC2, robi się przez prawie dokładnie 1000 adresów URL, a następnie zwraca ten błąd dla pozostałej 9,000+:

getaddrinfo: Temporary failure in name resolution 

Uwaga, próbowałem przy użyciu obu serwerów DNS Amazona i DNS Google'a serwerów, myśląc, że może to być uzasadniony problem z DNS. W obu przypadkach uzyskałem dokładnie taki sam wynik.

Następnie próbowałem uruchomić go na moim lokalnym MacBook Pro. Doszło jedynie przez około 250 przed powrotem tego błędu dla pozostałej części zapisów:

getaddrinfo: nodename nor servname provided, or not known 

Czy ktoś wie jak mogę uzyskać skrypt zrobić to przez wszystkie rekordy?

+0

Pokaż nam adres URL, na którym się nie powiodło. – pguardiario

+0

Błąd kończy się około 9000 z nich. Jednym z przykładów jest http://www.agilecommerce.com. Adresy URL działają, jeśli są podłączone do przeglądarki. – EricM

+0

Czy może ci brakować pamięci? – pguardiario

Odpowiedz

7

znalazłem rozwiązanie. Mechanize pozostawił otwarte połączenie i polegał na GC, aby je oczyścić. Po pewnym momencie było wystarczająco otwartych połączeń, że nie można było ustanowić żadnego dodatkowego połączenia wychodzącego, aby przeprowadzić wyszukiwanie DNS. Oto kod, który spowodował go do pracy:

agent = Mechanize.new do |a| 
    a.follow_meta_refresh = true 
    a.keep_alive = false 
end 

Ustawiając keep_alive false, połączenie zostanie natychmiast zamknięty i czyszczone.

0

Zobacz, czy to pomaga:

agent.history.max_size = 10 

To zachowa historię z użyciem zbyt dużej ilości pamięci