1

我终于让这个脚本工作了(谷歌应用脚​​本和json的新手,对javascript比较熟悉)。它适用于小型数据集,但一旦我跳转到包含 20,000 个项目的大型数据集,它就会超时!我想不出另一种方法来提高效率。这些价格每 3 分钟更新一次,因此我只想将其缓存 10 分钟。我觉得 ScriptDb 不适合这个。本质上,我必须将信息存储在缓存中,因为我有大约 500 个使用简单的非缓存版本的方程,testing()并且 google/api 不允许那么多调用。我想一通电话,从缓存中拉出约 500 次会更好。有什么方法可以提高我没有想到的效率吗?

每 10 分钟运行一次以存储信息。本片超时。

function updateCache() {
  var cache = CacheService.getPublicCache();
    var myUrl = "http://www.gw2spidy.com/api/v0.9/json/all-items/all"
    var jsonData = UrlFetchApp.fetch(myUrl);
    var jsonArray = JSON.parse(jsonData).results;
      for (var i =0; i < jsonArray.length; i++) {
      cache.put(jsonArray[i].data_id + 'sell', jsonArray[i].min_sale_unit_price, 1500);
      }
    return cache.get(itemID + 'sell')
    }

这是使用缓存并返回数据的函数。

function testing(itemID) {
  var cache = CacheService.getPublicCache();
return cache.get(itemID + 'sell')
}

更新 我更新了代码以使用分页。请参阅 Jon 评论中的后续问题。

//these are all four of the selling functions, cache for 35 min, run every 30 min
function updateSellCacheQ1() {
  var cache = CacheService.getPublicCache();
   for (var page = 0; page < 56; page++) {
   Logger.log('Sell Page #' + page);
   var myUrl = 'http://www.gw2spidy.com/api/v0.9/json/items/all/' + page
    var jsonData = UrlFetchApp.fetch(myUrl);
    var jsonArray = JSON.parse(jsonData).results;
      for (var i = 0; i < jsonArray.length; i++) {
      cache.put(jsonArray[i].data_id + 'sell', jsonArray[i].min_sale_unit_price, 2100);
      }
    }
   }
4

1 回答 1

1

您可以有一个例程(10 分钟计时器)来下载数据并将其作为纯文本文件转储到 Google 云端硬盘中。

然后,第二个计时器函数(每 2 分钟一次,或者任何不会触发单个执行失败的函数)可以将该平面文件的块处理到缓存/scriptDb 中

因此,如果您有一个 2 分钟的计时器来缓存 20% 的平面文件,则任何召回条目最多会过期 13 分钟,最少会过期 2 分钟。


或者,您不能根据项目列表查询 api 吗?所以一次更频繁地查询和缓存较小的块?计时器上的每个查询可以是顺序的还是可用项目类别的随机选择?

更新

https://github.com/rubensayshi/gw2spidy/wiki/API-v0.9#wiki-item-list

因此,如果您在查询中使用 /items/all/{page} 选项,您可以计算出在一次执行中可以安全地进行、检索和存储多少个查询。可以说是10。

var lastPageChecked = ScriptProperties.getProperty('lastPage') + 1,
    checkEnd = lastPageChecked + 10,
    myUrl,
    jsonData,
    jsonArray,
    page;

for (page = lastPageChecked; page < checkEnd; page += 1) {

  myUrl = "http://www.gw2spidy.com/api/v0.9/json/items/all/" + page;
  jsonData = UrlFetchApp.fetch(myUrl);
  jsonArray = Utilities.jsonParse(jsonData);

  if (page <= json.last_page) {

    // [snip] process however you like

  } else {
    page = 0;
    break;
  }
}

ScriptProperties.setProperty('last_page_checked', page);

尽可能频繁地运行该函数以这种方式格式化的每个查询都由 api 缓存 15 分钟,因此您有 15 分钟的时间进行剩余的 20 个页面调用。显然,如果您可以在一次执行中进行 20 次调用(2000 个对象),那么您只需要运行脚本 10 次 - 每分钟一次,您就有空闲时间:D

警告-我已经在stackoverflow的编辑器中编写了它,但没有对其进行测试。

显然,如果您运行:

"http://www.gw2spidy.com/api/v0.9/json/items/0/" + page 

所有的盔甲,比如说,对于每种类型,你会运行更多的触发器,但每个类别在理论上可能更“当前”

于 2013-08-08T21:12:10.467 回答