2015-07-13 29 views
0

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

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

你的大部分代码是关于在驱动器中查找文件的,你可以只打开想要的文件。 –

+0

告诉我们关于您的vmstat数据的更多信息。它多久更新一次?你是如何产生它的? – Mogsdad

+0

@ZigMandel是的,这是真的,但这只是一个未来的测试,我们会让用户选择他想要用于图表的文件。 – jackiejarvis

回答

2

这不是代码优化的问题(尽管代码不完美),而是分工。

Web应用程序性能优化的可接受方法涉及到三个方面的关注:演示文稿,业务逻辑和数据访问ref。除了产生vmstat输出外,您已将所有这些内容都集中在一处,让用户在Google Drive上查找文件时等待(使用两次详尽的搜索,btw),然后将其解析为Charts DataTable ,并最终生成HTML(通过UiApp)。

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

  • 演示文稿:从UiApp + Charts转移到HtmlService + Google Visualization。这将图表的生成移动到Web客户端,而不是保留在服务器中。这将使页面加载速度更快,从而启动。

  • 业务逻辑:这将是将数据映射到可视化中的规则。与构建在其上的图表服务一样,GViz使用具有列定义和数据行的DataTables。

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

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

    google.visualization.arrayToDataTable(...) 
    

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

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

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

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

编辑:在我的博客文章Converting from UiApp + Chart Service to Html Service + Google Visualization API中查看更多内容。

+0

增加了相关博文的链接。 – Mogsdad