Google应用脚本缓慢解析

时间:2015-07-13 13:53:41

标签: google-apps-script

我尝试使用Google Apps脚本解析vmstat,以便公司中的每个人都可以使用它来创建数据图表。你可以在这里找到我的代码,但这段代码非常慢。我能做些什么来使这个更好或者Google Apps脚本不适合这个吗?问题是需要处理的行数量。欢迎任何建议。

  function doGet(){

  var file = DriveApp.getFileById(id)

  var docContent = file.getAs('application/octet-stream').getDataAsString();
  var data = Charts.newDataTable()
                   .addColumn(Charts.ColumnType.STRING, 'TIME')
                   .addColumn(Charts.ColumnType.NUMBER, 'Memory');

  var lines = docContent.split("\n");
  Logger.log(lines.length);
  var i = 1;

  lines.forEach(function(line) {
    if ((line.indexOf('mem') < 0) && (line.indexOf('free') < 0)) {
      var values = line.match(/\S+/g);
      data.addRow(['5',parseInt(values[3])]); 
      Logger.log(i)
    }
    if (i == 20){
     return;
    }
    i++;
  }); 

  for( var i=0;i< lines.length;i++){
      data.addRow(['5',10]); 
  }
  data.build();

  var chart = Charts.newAreaChart()
      .setDataTable(data)
      .setStacked()
      .setRange(0, 400)
      .setTitle('Memory')
      .build();

 return UiApp.createApplication().add(chart);

}

1 个答案:

答案 0 :(得分:2)

这不是代码优化的问题(尽管代码并不完美),与工作分工一样多。

Web应用程序性能优化的可接受方法涉及分离三个问题;演示文稿,业务逻辑和数据访问 ref 。除了生成vmstat输出之外,您已将所有这些内容放在一个位置,让用户在Google云端硬盘上找到文件时等待(使用两次详尽的搜索,顺便说一句),然后将其解析为Charts DataTable,最后生成HTML(通过UiApp)。

您可能会发现Google Apps脚本演示文稿的辅助功能对您的组织非常有用。 (例如,我在我的工作场所知道我们的IT人员会对内部Web服务器进行限制。)如果是这样,请考虑您拥有的原型,并重构它以提供更好的感知性能。

  • 演示文稿:从UiApp +图表移至HtmlService + Google Visualization。这会将图表的生成移动到Web客户端,而不是将其保留在服务器中。这将提供更快的页面加载,开始。

  • 业务逻辑:这将是将数据映射到可视化的规则。与通过它构建的图表服务一样,GViz将DataTables与列定义和数据行一起使用。

    此处的一个选项是重复列定义&amp;您已经拥有的数据加载,但在JavaScript中的客户端除外。这样做会比通过Google Apps脚本快得多。

    第二个选项,更快,特别是对于大型数据集,是从数组加载数据。

    google.visualization.arrayToDataTable(...)
    

    无论哪种方式,您都需要将数据提供给构建图表的JavaScript函数。

  • 数据访问:(我假设)您当前正在Linux中运行一个调用vmstat的shell脚本,并将输出通过管道传输到本地Google云端硬盘文件夹中的文件。 (或者,该脚本可能正在使用Drive API将文件推送到Google云端硬盘。)此文件为纯文本。

    我在此处所做的更改是从vmstat生成csv输出,并使用Google Apps脚本将csv导入电子表格。然后,您可以使用Sheet.getSheetValues()一次性读取所有数据,在服务器端函数中从客户端JavaScript调用。

这不会像本地服务器解决方案那么快,但它可能是使用Google Apps脚本环境执行此操作的最佳方式。

修改:在我的博文Converting from UiApp + Chart Service to Html Service + Google Visualization API中了解详情。