我尝试使用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);
}
答案 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中了解详情。