两个错误之一:内存不足或 Javascript 运行时意外退出
Posted
技术标签:
【中文标题】两个错误之一:内存不足或 Javascript 运行时意外退出【英文标题】:One of two errors: Out of memory or Javascript runtime exited unexpectedly 【发布时间】:2020-08-26 14:35:59 【问题描述】:我没有找到任何其他真正反驳这个问题的话题。
正如标题所说,我在尝试运行以下代码时遇到了这两个错误之一: (出于隐私目的,我编辑了项目 ID、查询和文件 ID。)
function runQuery()
var projectId = 'projectId';
var request =
query: 'SELECT * FROM [databaseName];'
;
var queryResults = BigQuery.Jobs.query(request, projectId);
var jobId = queryResults.jobReference.jobId;
// Check on status of the Query Job.
var sleepTimeMs = 500;
while (!queryResults.jobComplete)
Utilities.sleep(sleepTimeMs);
sleepTimeMs *= 2;
queryResults = BigQuery.Jobs.getQueryResults(projectId, jobId);
// Get all the rows of results.
var rows = queryResults.rows;
while (queryResults.pageToken)
queryResults = BigQuery.Jobs.getQueryResults(projectId, jobId,
pageToken: queryResults.pageToken
);
rows = rows.concat(queryResults.rows);
if (rows)
var fileID = 'fileID';
var spreadsheet= SpreadsheetApp.openById(fileID);
var sheet = spreadsheet.getSheetByName("tabId");
sheet.clear();
// Append the headers.
var headers = queryResults.schema.fields.map(function(field)
return field.name;
);
sheet.appendRow(headers);
// Append the results.
var data = new Array(rows.length);
for (var i = 0; i < rows.length; i++)
var cols = rows[i].f;
data[i] = new Array(5);
for (var j = 0; j < cols.length; j++)
data[i][j] = cols[j].v;
sheet.getRange(2, 1, rows.length, 5).setValues(data);
Logger.log('Results spreadsheet created: %s',
spreadsheet.getUrl());
else
Logger.log('No rows returned.');
错误 1: javascript 运行时意外退出。解雇
错误 2: 内存不足错误。解雇
额外信息
数据库信息:
144625 行 5 列 文件中有 1 张在写之前,我清除工作表中的所有内容和格式:
if (rows)
var fileID = 'fileID';
var spreadsheet= SpreadsheetApp.openById(fileID);
var sheet = spreadsheet.getSheetByName("tabId");
sheet.clear();
当我在清除工作表后记录行数和列数时:
1000 行 26 列我猜这是标准尺寸。
结果
代码运行后我收到错误,只有标题已写入电子表格。没有其他单元格被填充:
1 行 5 列我该如何解决这个问题?如果您需要更多信息,请随时询问。
【问题讨论】:
引用错误的确切文本。它发生的线。任何以下语句,如“解雇”。电子表格中的工作表数。每个工作表中的行/列数,包括空行/列。填充的行数...脚本的执行时间(秒) 我添加了一些额外的信息。这足以查明问题吗? @TheMaster 视图中的执行时间> 执行?基本上,您有 144625×5=723125 个单元格的数据。假设每个单元格 20 字节(大约 10 个字符),我们的总大小为 14462500 字节或 144MB,这对于应用程序脚本环境可能很多(有根据的猜测是 100mb 限制)。拆分执行如何?每 25k 行设置 Values() 数据,以便内存中不再需要这些数据 【参考方案1】:在大型 XML 文件 (> 6MB) 上使用 getDescendants()
时,我遇到了非常相似的问题。由于getDescendants()
是XML Service中的一个方法,所以不知道是在将结果传递给运行时之前的on还是它接收到结果时引起的。
在我的情况下,我通过使用 getChildren(name, namespace)
而不是 getDescendants()
解决了这个问题,它返回了 ~6000 个元素。
在这种情况下,正如 TheMaster 所建议的,尝试限制 data
的大小,当数据达到一定长度(即 5000)时将数据传递到电子表格,然后清除 data
。
【讨论】:
以上是关于两个错误之一:内存不足或 Javascript 运行时意外退出的主要内容,如果未能解决你的问题,请参考以下文章
致命错误:使用任何“npm”命令时 JavaScript 堆内存不足
错误:接近堆限制的无效标记压缩分配失败 - JavaScript 堆内存不足
如何修复“致命错误:堆限制附近的无效标记压缩分配失败 - JavaScript 堆内存不足”错误
致命错误:堆限制附近的无效标记压缩分配失败 - JavaScript 堆内存不足 |反应