0

Google ジオコード API からの恐ろしいクエリ制限メッセージを回避しようとしています。

サーバーから 10 個のバッチでデータを取得しています。1 つのバッチ内ではタイミングは良好ですが、バッチ間で遅延が大きくなり、理解できません。新しいレコードを取得するタイミングを確認しましたが、それは 1 秒未満であり、問​​題ではありません。

ギャップが作成される場所 (および理想的にはギャップを削除する方法) についてのガイダンスを探しています。正確なコードは以下のとおりです。私は基本的に、さまざまなバッチで安定したカウンターを使用し、setTimeout を のタイミングで使用して、(300*counter)すべてが同時に起動しないようにします。これもバッチ内ではうまく機能しますが、バッチ間では機能しません。

異なるバッチ間のタイミングは次のとおりです。

start batch 1 :"2013-03-26 15:40:15.882337"
stop batch  1 :"2013-03-26 15:40:18.586881"
start batch 2 :"2013-03-26 15:40:21.688363" (3 seconds between batches)
stop batch  2 :"2013-03-26 15:40:24.384641"
start batch 3 :"2013-03-26 15:40:30.449829" (6 seconds between batches)
stop batch  3 :"2013-03-26 15:40:33.150393"
start batch 4 :"2013-03-26 15:40:42.216579" (9 seconds between batches)
stop batch  4 :"2013-03-26 15:40:44.917545"
start batch 5 :"2013-03-26 15:40:56.991258" (12 seconds between batches)
stop batch  5 :"2013-03-26 15:40:59.689068"
start batch 6 :"2013-03-26 15:41:14.742534" (15 seconds between batches)
stop batch  6 :"2013-03-26 15:41:17.444024"
start batch 7 :"2013-03-26 15:41:35.500424" (18 seconds between batches)

ご覧のとおり、バッチ間のギャップが拡大しています。

私が使用するコード:

  getRecords: function(data, textStatus, xhr) {

    var self = this;
    var recordsDone = 0;

    if (data) {
      for (var i = 0; i < data.geocode.length; i++) {

        // build the address string
        var addressQuery = this.buildAddress(data, i);

        setTimeout(function(addr, recId) {
          self.googleGeocoder.geocode({'address': addr}, function(result, status) {
            if (status === google.maps.GeocoderStatus.OK ) {
              $.ajax({
                url: '/geocode/' + recId + '.json',
                data: {'status': status, 'lat': result[0].geometry.location.kb, 'long': result[0].geometry.location.lb},
                type: 'PUT',
                success: function(data, textStatus, xhr) {
                  var total = parseFloat(data.total);
                  var done = parseFloat(data.done);
                  self.set('voortgang', (done/total)*100);
                },
                error: function(xhr, textStatus, errorThrown) {

                }
              });
            } else {
              $.ajax({
                url: '/geocode/' + recId + '.json',
                data: {'status': status},
                type: 'PUT',
                success: function(datra, textStatus, xhr) {
                  var total = parseFloat(data.total);
                  var done = parseFloat(data.done);
                  self.set('voortgang', (done/total)*100);
                },
                error: function(xhr, textStatus, errorThrown) {

                }
              });
            }

            recordsDone++;

            if (recordsDone === data.geocode.length) {
              console.log('about to get records ' + new Date().toUTCString());
              $.ajax({
                url: '/geocode.json',
                data: {data_set_id: self.datasetid},
                type: 'GET',
                success: function (data, textStatus, xhr) {
                  console.log('got the records ' + new Date().toUTCString());
                  self.getRecords(data, textStatus, xhr);
                },
                error: function(xhr, textStatus, errorThrown) {
                  // set to fully geocoded
                  var found = self.get('content').findProperty('id', self.datasetid);
                  Ember.set(found, 'data_set.fully_geocoded', true);
                  self.set(voortgang, 0);
                }
              });
            }
          });
        }, (300*this.globalRecordsDone), addressQuery, data.geocode[i].id);

        // another record has been handled
        this.globalRecordsDone++;
      }
    }

    // get records the first time
    if (this.firstTime === true) {
      $.ajax({
        url: '/geocode.json',
        data: {data_set_id: this.datasetid},
        type: 'GET',
        success: function (data, textStatus, xhr) {
          self.getRecords(data, textStatus, xhr);
        },
        error: function(xhr, textStatus, errorThrown) {
          alert('stop getting records');
        }
      });

      this.firstTime = false;
    }

  }
4

2 に答える 2

0

あなたの問題はこの行にあるようです:

}, (300*this.globalRecordsDone), addressQuery, data.geocode[i].id);

私はあなたがただ欲しいと思います:

}, (300), addressQuery, data.geocode[i].id);

setTimeout待機時間を増やしています。最初のバッチは、リクエスト間で 300 ミル、2 番目のラウンドは 600 ミル、3 番目のラウンドは 900 ミルなどを待機しています。これが 3 秒 (300 ミル x 10 レコード = 3 秒) を取得している理由です。 、600 ミル x 10 レコード = 6 秒)。

于 2013-03-26T17:09:17.923 に答える
0

タイミングをループの関数にしました。クエリ制限を超えずにデータセットを通過するには、タイムアウトを 1200 に増やす必要がありました。バッチ間に 3 秒の最小ブレークがあるため、以前はクエリ制限内にとどまっていたと思います。プロセスは現在、明白な中断なしで流暢です。

だから代わりに

}, (300*this.globalRecordsDone), addressQuery, data.geocode[i].id);

になりました

}, (1200*i), addressQuery, data.geocode[i].id);
于 2013-03-27T09:42:33.810 に答える