[英]Google apps script slow parsing
我試圖使用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);
}
與分工一樣,這不是代碼優化的問題(盡管代碼不是完美的)。
公認的Web應用程序性能優化方法涉及三個方面的分離: 演示,業務邏輯和數據訪問參考 。 除了生成vmstat
輸出之外,您已經將所有內容都放在了一個地方,使用戶等待在Google雲端硬盤上找到文件時(使用兩次詳盡的搜索,順便說一句),然后將其解析為Charts DataTable ,最后生成HTML(通過UiApp)。
您可能會發現Google Apps腳本演示文稿的可訪問性對您的組織很有用。 (例如,在我的工作場所中,我知道我們的IT人員會使用內部Web服務器。)如果是這樣,請考慮您擁有的原型,然后對其進行重構以提供更好的感知性能。
演示:從UiApp +圖表移至HtmlService + Google可視化。 這會將圖表的生成移至Web客戶端,而不是將其保留在服務器中。 這樣可以加快頁面加載速度。
業務邏輯:這是將您的數據映射到可視化中的規則。 像在其之上構建的Charts Service一樣,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腳本環境的最佳方法。
編輯:在我的博客文章“ 從UiApp +圖表服務轉換為HTML服務+ Google可視化API”中了解有關此內容的更多信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.