首页 > 解决方案 > 两个错误之一:内存不足或 Javascript 运行时意外退出

问题描述

我没有找到任何其他真正反驳这个问题的话题。

正如标题所说,我在尝试运行以下代码时遇到了这两个错误之一:(出于隐私目的,我编辑了项目 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:内存不足错误。解雇

额外信息

数据库信息:

在写作之前,我清除工作表中的所有内容和格式:

  if (rows) {
var fileID = 'fileID';
var spreadsheet= SpreadsheetApp.openById(fileID);
var sheet = spreadsheet.getSheetByName("tabId");
sheet.clear();

当我在清除工作表后记录行数和列数时:

我想这是标准尺寸。

结果

代码运行后我得到错误,只有标题被写入电子表格。没有其他单元格被填充:

我该如何解决这个问题?如果您需要更多信息,请随时询问。

标签: javascriptgoogle-apps-scriptgoogle-sheetsgoogle-bigquery

解决方案


getDescendants()在大型 XML 文件 (> 6MB) 上使用时,我遇到了非常相似的问题。作为getDescendants()来自 XML 服务的方法,我不知道问题是由 on 在将结果传递给运行时之前还是由它接收到结果时引起的。

就我而言,我通过使用getChildren(name, namespace)而不是getDescendants()返回约 6000 个元素解决了这个问题。

在这种情况下,正如 TheMaster 所建议的,尝试限制 , 的大小data是通过在数据达到一定长度(即 5000)时将数据传递到电子表格,然后清除data


推荐阅读