两个错误之一:内存不足或 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 堆内存不足 |反应

致命错误:CALL_AND_RETRY_LAST 分配失败 - JavaScript 堆内存不足错误

npm install - javascript堆内存不足