Google apps script 批处理和API-性能
我正在用谷歌应用程序脚本打电话 我有一个奇怪的问题。对于create,批处理速度非常快(20条记录需要4秒,我还没有尝试更多) 然而,复制文件的速度非常慢。如果有超过20条记录,并且这20条记录大约需要58秒,那么它将获得批处理api超时。因此,每个文件3秒,这与我使用基本for loop和driveapp.copy调用获得的速度相同(工作了很多小时之后)。更糟糕的是,事实上,因为至少如果我使用for循环,我可以运行30分钟而不是60秒 有什么办法可以加快速度吗?有什么我没记住的吗Google apps script 批处理和API-性能,google-apps-script,google-drive-api,Google Apps Script,Google Drive Api,我正在用谷歌应用程序脚本打电话 我有一个奇怪的问题。对于create,批处理速度非常快(20条记录需要4秒,我还没有尝试更多) 然而,复制文件的速度非常慢。如果有超过20条记录,并且这20条记录大约需要58秒,那么它将获得批处理api超时。因此,每个文件3秒,这与我使用基本for loop和driveapp.copy调用获得的速度相同(工作了很多小时之后)。更糟糕的是,事实上,因为至少如果我使用for循环,我可以运行30分钟而不是60秒 有什么办法可以加快速度吗?有什么我没记住的吗 functi
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/获取,但我在gmail api的最佳实践页面上发现它应该更具体。响应只包括fileid、名称和mimetype,因此限制返回的字段似乎不是很有用
实际上将其限制为”https://www.googleapis.com/drive/v3/files/“+字典[key]。源+”/copy?字段=id,名称“,
似乎每分钟给了我更多的记录,但不是很多,我仍然无法复制30个文件而不破坏api超时。在这种情况下,您只上载20个文件,批量上载与循环上的多个单个文件上载相比并没有显着的优势。然而,这是可能的最佳实践,除了优化代码以便更快地解释之外,您没有其他方法可以加快它的速度。您可以阅读,以避免达到其限制,并收集更多详细信息。在这种情况下,您只上载20个文件,批量上载与循环上的多个单个文件上载相比并没有明显的优势。然而,这是可能的最佳实践,除了优化代码以便更快地解释之外,您没有其他方法可以加快它的速度。您可以阅读以避免达到其极限,并收集更详细的信息。在我的环境中,我从未体验过。因此,为了正确了解您的情况,我可以问一下30个文件的mimeType和文件大小吗?因为我认为如果文件大,可能会发生这样的错误。但我认为这是需要测试的。它是一个混合了gsheet、pdf和gdocs的系统,还有几个大拉链。你认为尺寸会有所不同吗?谢谢你的回复。我以为是的。但我从未测试过这个。因此,我不得不为我糟糕的经验道歉。使用批处理的唯一原因是在多次调用API时为您节省HTTP调用。出于您所述的所有原因,我从来都不是批处理的粉丝。批处理不会更快,批处理不会提高您的配额使用率,批处理可能会导致运行到fast配额错误,因为它是同一个用户执行每个批处理请求,如果服务器只快一次,那么您将收到洪水保护错误。批处理请求中的PDF和ZIP是否总共超过50MB?在我的环境中,我从未经历过。因此,为了正确了解您的情况,我可以问一下30个文件的mimeType和文件大小吗?因为我认为如果文件大,可能会发生这样的错误。但我认为这是需要测试的。它是一个混合了gsheet、pdf和gdocs的系统,还有几个大拉链。你认为尺寸会有所不同吗?谢谢你的回复。我以为是的。但我从未测试过这个。因此,我不得不为我糟糕的经验道歉。使用批处理的唯一原因是在多次调用API时为您节省HTTP调用。出于您所述的所有原因,我从来都不是批处理的粉丝。批处理不会更快,批处理不会提高您的配额使用率,批处理可能会导致运行到fast配额错误,因为它是同一个用户执行每个批处理请求,如果服务器只快一次,那么您将收到洪水保护错误。批处理请求中的PDF和ZIP是否总共超过50MB?当我处理超过20个文件时,它会在60秒后发回超时错误。。。。有没有办法防止这种情况发生?在这种情况下,我强烈建议将文件拆分为单个文件上传。如果您真的想使用批处理文件,解决方案是将批处理拆分为较小的批处理。当我处理的文件超过20个时,它会在60秒后发回超时错误。。。。有没有办法防止这种情况发生?在这种情况下,我强烈建议将文件拆分为单个文件上传。如果您确实想使用批处理文件,解决方案是将批处理拆分为较小的批处理。