2011-08-05 2 views
0

여기 상황이 있습니다. 나는 그 웹 사이트 (사이트에 게시 된 모든 기사를 가리키는 URL 목록)에서 제공하는 로봇 페이지를 사용하여 기사의 데이터를 가져 오기 위해 웹 사이트를 폐기하고 있습니다. 지금까지 데이터베이스의 병합을 수행하여 URL을 내 테이블에 '업'레이트했습니다. 1400 개가 넘는 기사를 파싱해야하기 때문에 각각의 파기 작업은 훌륭하게 진행됩니다. 난 단지 내 서버, 등등 과부하하지 않도록 한 번에 크론에 작업의 작은 덩어리를 할 알고리즘을 작성해야합니다.크론 실행시 제한된 데이터 덩어리의 색인 생성/구문 분석 알고리즘 작성 도움말

편집 : 나는 drupal 7 또한, 시간이 지남에 따라 진행되는 스크립트가 있어야하며 데이터베이스의 초기 채우기에 걸리는 시간이 그리 걱정스럽지 않습니다. 로봇 페이지는 동적이며 기사가 추가되면 정기적으로 URL이 추가됩니다. 현재 hook_cron()을 사용하고 있습니다 만, 그보다 나은 방법이 있다면 더 나은 방법을 사용할 수 있습니다.

+0

각 기사 사이를 60 초 정도 기다리는 것은 어떻습니까? 당신은 하루 만에 끝날 것입니다. –

+0

좋아요,하지만 어떻게해야합니까? – MaxGhost

답변

1

Drupal queue operations API을 사용하여 대기열 항목으로 스크랩하도록 각 페이지를 큐에 넣을 수 있습니다. 큐를 cron-executed로 선언 할 수는 있지만 필수는 아닙니다. Drupal은 최대 실행 시간을 선언 한 대기열에 도달하지 않고 각 cron run에서 많은 대기열 항목을 실행하는 데 신경을 씁니다.

항목 큐잉의 예는 aggregator_cron을 참조하십시오. 그리고 aggregator_cron_queue_info은 cron 동안 이러한 대기중인 항목을 Drupal이 처리하게하는 선언입니다.

일반적인 Drupal cron 중 대기열 처리가 문제인 경우 Waiting Queue 또는 Beanstalkd integration과 같은 모듈을 사용하여 독립적으로 대기열을 처리 할 수 ​​있습니다.

+0

이 옵션이 가장 좋습니다. 감사! – MaxGhost

+0

저는 이것을 구현하는 중이며, 지금까지는 그렇게 잘하고 있습니다. 내가 가지고있는 한가지 문제점은 중복 큐 항목을 방지하지 않는다는 것입니다. 나는 그것을 구현하는 방법을 알아낼 수 없습니다. 항목이 이미 대기열에 있는지 어떻게 확인할 수 있습니까? – MaxGhost

+0

이미 대기중인 항목에 대한 정보를 DB에 유지해야합니다. 예를 들어 aggregator_cron은 aggregator_refresh로 지워지는 타임 스탬프를 추가합니다. –

0

대부분의 경우 각 기사를 가져 오는 HTTP 오버 헤드가 데이터베이스 작업 수행의 오버 헤드보다 중요합니다. 병렬로 너무 많은 기사를 가져 오지 않아도됩니다. 대부분의 웹 마스터는 특히 10, 20, 500 + 병렬 검색을 수행 할 때 스크래퍼를 싫어합니다.

+0

나는 그 부분을 이미 알고 있었고, HTTP 오버 헤드는 꽤 컸다. 우리는 이것을 일종의 유일한 선택 사항으로 여기고 있습니다 (이런 식으로하는 이유를 설명하기에는 너무 복잡합니다). – MaxGhost

+0

작업을 여러 청크로 분할하고 스크립트를 실행하여 각 청크를 독립적으로 처리합니다. 스크립트 # 1은 URL이 1-50, # 2가 51-100 등을 얻습니다. 스크립트 수를 낮게 유지하십시오 (아마 5 개). 그러면 URL을 순차적으로 가져 오는 단 하나의 스크립트만으로도 가져올 시간을 20 % (이론적으로) 줄일 수 있습니다. –

+0

동의. 파스 + 일괄 업데이트를하는 것은 정말 빠릅니다. – nflacco

0

그래서 이미 데이터베이스에 URL이 있습니다. 해당 테이블에서 상태 열을 스크랩했는지 여부. 크론은 테이블에서 긁히지 않은 다음 URL을 붙잡고 긁어 모으는 것처럼 표시 할 때마다 자주 시작할 수 있습니다.