2012-11-01 5 views
5

데이터베이스의 모든 고객을 대상으로 스크립트를 작성하여 웹 사이트 URL이 작동하는지 확인하고 해당 홈페이지에서 트위터 링크를 찾으십시오. 확인할 URL이 10,000 개가 넘습니다. URL의 일부가 검증 된 후에 모든 URL에 대해 getaddrinfo 오류가 발생하기 시작합니다.기계로 가공 한 getaddrinfo 오류

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 

참고 :

여기에 하나의 URL을 긁는 코드의 복사본입니다 또한 모든 scrape_url 호출간에 공유됩니다 하나의 기계화 인스턴스를 만들고이 코드의 버전을 실행했습니다. 정확히 같은 방식으로 실패했습니다. 내가 EC2에서이 프로그램을 실행할 때

, 그것은 다음 9,000+ 나머지에 대해이 오류를 반환, 거의 정확하게 1000 URL을 통해 가져옵니다

getaddrinfo: Temporary failure in name resolution 

주, 나는 아마존의 DNS 서버와 구글의 DNS를 모두 사용하여 시도했다 서버가 합법적 인 DNS 문제 일 수 있다고 생각합니다. 두 경우 모두 똑같은 결과를 얻었습니다.

그런 다음 로컬 MacBook Pro에서 실행 해 보았습니다.

getaddrinfo: nodename nor servname provided, or not known 

사람이 내가 스크립트가 모든 레코드를 통해 그것을 만들 얻을 수있는 방법을 알고 있나요 : 그것은 단지 기록의 나머지 부분이 오류를 반환하기 전에 약 250를 통해있어?

agent.history.max_size = 10 

그것은 내가 해결책을 발견

+0

우리가 실패하고있는 URL을 보여주십시오. – pguardiario

+0

약 9,000 명이 실패합니다. 한 가지 예가 http://www.agilecommerce.com입니다. URL은 브라우저에 연결하면 작동하는 경향이 있습니다. – EricM

+0

메모리가 부족할 수 있습니까? – pguardiario

답변

7

너무 많은 메모리를 사용하는 역사를 계속합니다 :이 도움이된다면

0

을 참조하십시오. Mechanize는 연결을 열린 채로두고 GC를 사용하여이를 정리했습니다. 특정 시점 이후에 DNS 조회를 수행하기 위해 추가 아웃 바운드 연결을 설정할 수있는 충분한 연결이 열려있었습니다. 다음은 작동하게 만든 코드입니다.

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

keep_alive를 false로 설정하면 연결이 즉시 닫히고 정리됩니다.