heritrixキャプチャ速度の向上


最近ずっとheritrixでウェブサイトを登って、夜heritrixはずっと運行して、しかし不思議なことにheritrixはスピードをつかんでとても遅くて、1つのウェブサイトをつかんで、8時間余り使って、意外にも運行し終わっていません.そこでLOGに基づいて遅い原因を分析してみました
 
 -----===== SNOOZED QUEUES =====-----
SNOOZED#0:
Queue us,imageshack,img245,+2 (p1)
  1 items
   wakes in: 99m19s74ms
    last enqueued: http://img245.xxx.us/img245/596/193183637x01ss500sclzzzbx0.jpg      last peeked: http://img245.xxxx.us/img245/596/193183637x01ss500sclzzzbx0.jpg   total expended: 12 (total budget: -1)
   active balance: 2988
   last(avg) cost: 1(1)
   totalScheduled fetchSuccesses fetchFailures fetchDisregards fetchResponses robotsDenials successBytes totalBytes fetchNonResponses
   2 1 0 0 1 0 59 59 12
   SimplePrecedenceProvider
   1

SNOOZED QUeneの中にはずっとそこにある画像があり、かなり長い間稼働していました.
ブラウザで開くと、その画像は存在しないので、その画像はずっとQUENEの中にあります.
 
次にheritrixのコードを分析しました.
 
workQueneFrontierには次のコードがあります.画像が存在しないためneedsRetryingコードブロックに入ります.
      
        if (needsRetrying(curi)) {
            // Consider errors which can be retried, leaving uri atop queue
            if(curi.getFetchStatus()!=S_DEFERRED) {
                wq.expend(curi.getHolderCost()); // all retries but DEFERRED cost
            }
            long delay_sec = retryDelayFor(curi);
            curi.processingCleanup(); // lose state that shouldn't burden retry

                wq.unpeek(curi);
                // TODO: consider if this should happen automatically inside unpeek()
                wq.update(this, curi); // rewrite any changes
                if (delay_sec > 0) {
                    long delay_ms = delay_sec * 1000;
                    snoozeQueue(wq, now, delay_ms);
                } else {
                    reenqueueQueue(wq);
                }

            // Let everyone interested know that it will be retried.
            appCtx.publishEvent(
                new CrawlURIDispositionEvent(this,curi,DEFERRED_FOR_RETRY));
            doJournalRescheduled(curi);
            return;
        }

 
 
 
retryDelayForメソッドは、失敗をキャプチャし、待機時間を計算するために使用されます.コードは次のとおりです.
 
    /**
     * Return a suitable value to wait before retrying the given URI.
     * 
     * @param curi
     *            CrawlURI to be retried
     * @return millisecond delay before retry
     */
    protected long retryDelayFor(CrawlURI curi) {
        int status = curi.getFetchStatus();
        return (status == S_CONNECT_FAILED || status == S_CONNECT_LOST ||
                status == S_DOMAIN_UNRESOLVABLE)? getRetryDelaySeconds() : 0;
                // no delay for most
    }

    public int getRetryDelaySeconds() {
        return (Integer) kp.get("retryDelaySeconds");
    }

 
heritrixはデフォルトで900秒待ち、つまり15分なので、キャプチャに失敗しても1時間に4回、8時間に32回しか実行できないので、ずっと実行しているのも無理はないでしょう.
 
  /** for retryable problems, seconds to wait before a retry */
    {
        setRetryDelaySeconds(900);
    }

原因がわかったらやりやすいので、プロファイルを修正します.
 
 <!-- FRONTIER: Record of all URIs discovered and queued-for-collection -->
 <bean id="frontier" 
   class="org.archive.crawler.frontier.BdbFrontier">
  <!-- <property name="holdQueues" value="true" /> -->
  <!-- <property name="queueTotalBudget" value="-1" /> -->
  <!-- <property name="balanceReplenishAmount" value="3000" /> -->
  <!-- <property name="errorPenaltyAmount" value="100" /> -->
  <!-- <property name="precedenceFloor" value="255" /> -->
  <!-- <property name="queuePrecedencePolicy">
        <bean class="org.archive.crawler.frontier.precedence.BaseQueuePrecedencePolicy" />
       </property> -->
  <!-- <property name="snoozeLongMs" value="300000" /> -->
   <property name="retryDelaySeconds" value="90" /> 
  <!-- <property name="maxRetries" value="30" /> -->
  <!-- <property name="recoveryDir" value="logs" /> -->
  <!-- <property name="recoveryLogEnabled" value="true" /> -->
  <!-- <property name="maxOutlinks" value="6000" /> -->
  <!-- <property name="outboundQueueCapacity" value="50" /> -->
  <!-- <property name="inboundQueueMultiple" value="3" /> -->
  <!-- <property name="dumpPendingAtClose" value="false" /> -->
 </bean>

 
これはheritrix 3の構成で、時間を90秒に変更し、つまり1分半しか待つことができません.
H 1の構成であれば、管理インタフェースで構成できます.
速度を変えてみると、8時間で1つのサイトを登ることができたが、今は2時間でいい.
もう一度heritrixを使えば
インクリメンタルキャプチャでは、次にこのWebサイトをキャプチャすると、速度が大幅に増加します.これで問題は解決した