Пакетирование и API - производительность - PullRequest
2 голосов
/ 08 октября 2019

Я звоню из скрипта Google Apps.

У меня странная проблема. Для создания пакетирование выполняется очень быстро (например, 4 секунды для 20 записей, и я не пробовал больше).

Копирование файла, однако, происходит очень медленно. Он получает время пакетного API, если имеется более 20 записей, и эти 20 записей занимают около 58 секунд. Таким образом, 3 секунды на файл, что (после многих часов работы) - та же скорость, которую я получаю с базовыми вызовами for и driveapp.copy. Хуже, на самом деле, потому что, по крайней мере, если я использую цикл for, я могу работать в течение 30 минут, а не 60 секунд.

Есть ли способ ускорить его? Что-то, о чем я не имею в виду?

function COPYBATCH(dictionary) {
  var body = [];
  for (var key in dictionary)

    {
      var object = {
      method: "POST",
      endpoint: "https://www.googleapis.com/drive/v3/files/"+dictionary[key].source+"/copy",
      requestBody: {
        "parents": [
           dictionary[key].parent,
        ],

         "name": key 
      }     

      };
      body.push(object);
    }
  Logger.log(body.length);

  var boundary = "xxxxxxxxxx";
  var contentId = 0;
  var data = "--" + boundary + "\r\n";
  for (var i in body) {
        data += "Content-Type: application/http\r\n";
        data += "Content-ID: " + ++contentId + "\r\n\r\n";
        data += body[i].method + " " + body[i].endpoint + "\r\n";
        data += body[i].requestBody ? "Content-Type: application/json; charset=utf-8\r\n\r\n" : "\r\n";
        data += body[i].requestBody ? JSON.stringify(body[i].requestBody) + "\r\n" : "";
        data += "--" + boundary + "\r\n";
  }
  var payload = Utilities.newBlob(data).getBytes();
  var options = {
    method: "post",
    contentType: "multipart/mixed; boundary=" + boundary,
    payload: payload,
    headers: {'Authorization': 'Bearer ' + ScriptApp.getOAuthToken()},
    muteHttpExceptions: true,
  };
  var res = UrlFetchApp.fetch("https://www.googleapis.com/batch/drive/v3", options).getContentText();
  Logger.log(res);
  return parseResponseArray(res,dictionary);

}

Вещи, которые я пробовал: у меня изначально была пакетная загрузка из / batch /, но я нашел на странице рекомендаций для API gmail, что это должно бытьболее конкретно. Ответ включает в себя только fileid, имя и mimetype, поэтому ограничение возвращаемых полей не выглядит, как SEEM, очень полезным.

Фактически, ограничение на "https://www.googleapis.com/drive/v3/files/"+dictionary[key].source+"/copy?fields=id,name",, похоже, дало мне еще несколько записей в минуту, но не так много, я все еще не могу скопировать 30 файлов, пока он не превысил тайм-аут API.

1 Ответ

1 голос
/ 08 октября 2019

В этом сценарии, когда вы загружаете только 20 файлов, пакетная загрузка не дает заметного преимущества перед несколькими закачками отдельных файлов в цикле. Тем не менее, это лучшая возможная практика, и вы ничего не можете сделать для ее ускорения, кроме как оптимизировать код, чтобы его можно было интерпретировать быстрее. Вы можете прочитать документацию для партии , чтобы избежать превышения ее пределов и собрать более подробную информацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...