support different granularities, this to reduce memory consumption when required
This commit is contained in:
parent
04838c4e4f
commit
efc7062e7d
25
index.html
25
index.html
@ -39,6 +39,31 @@
|
|||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="btn-group">
|
||||||
|
<div class="btn-group">
|
||||||
|
<button id="btn_xaxis" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" class="btn-default btn">
|
||||||
|
Granularity <span class="caret"></span>
|
||||||
|
</button>
|
||||||
|
<ul class="dropdown-menu">
|
||||||
|
<li><a href="#" onclick="change_granularity(1, 'avg');">all ticks</a></li>
|
||||||
|
<li class="divider"></li>
|
||||||
|
<li><a href="#" onclick="change_granularity(5, 'avg');">5 ticks / average</a></li>
|
||||||
|
<li><a href="#" onclick="change_granularity(5, 'max');">5 ticks / maximum</a></li>
|
||||||
|
<li class="divider"></li>
|
||||||
|
<li><a href="#" onclick="change_granularity(15, 'avg');">15 ticks / average</a></li>
|
||||||
|
<li><a href="#" onclick="change_granularity(15, 'max');">15 ticks / maximum</a></li>
|
||||||
|
<li class="divider"></li>
|
||||||
|
<li><a href="#" onclick="change_granularity(30, 'avg');">30 ticks / average</a></li>
|
||||||
|
<li><a href="#" onclick="change_granularity(30, 'max');">30 ticks / maximum</a></li>
|
||||||
|
<li class="divider"></li>
|
||||||
|
<li><a href="#" onclick="change_granularity(60, 'avg');">60 ticks / average</a></li>
|
||||||
|
<li><a href="#" onclick="change_granularity(60, 'max');">60 ticks / maximum</a></li>
|
||||||
|
<li class="divider"></li>
|
||||||
|
<li><a href="#" onclick="change_granularity(300, 'avg');">300 ticks / average</a></li>
|
||||||
|
<li><a href="#" onclick="change_granularity(300, 'max');">300 ticks / maximum</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="btn-group" id="right-menu">
|
<div class="btn-group" id="right-menu">
|
||||||
<a href"#" onclick="refresh();"><span class="glyphicon glyphicon-repeat"/></a>
|
<a href"#" onclick="refresh();"><span class="glyphicon glyphicon-repeat"/></a>
|
||||||
|
2363
js/bootstrap.js
vendored
Normal file
2363
js/bootstrap.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
@ -55,7 +55,12 @@ $(document).ready(function() {
|
|||||||
/*
|
/*
|
||||||
* Settings functions
|
* Settings functions
|
||||||
*/
|
*/
|
||||||
var settings = { "interface": "standard", "xaxis": 'time' }
|
var settings = {
|
||||||
|
"interface": "standard",
|
||||||
|
"xaxis": 'time',
|
||||||
|
"granularity": undefined, // set while browsing the first file
|
||||||
|
"agg_function": "avg"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -151,6 +156,19 @@ function processCSV(csv, filename) {
|
|||||||
map[i] = {group: gindex, index: j, name: headers[i]};
|
map[i] = {group: gindex, index: j, name: headers[i]};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* try to increase granularity to reduce memory consumption if required */
|
||||||
|
// TODO be smarter here, save different configuration per file?
|
||||||
|
|
||||||
|
if (settings.granularity === undefined) {
|
||||||
|
if (lines.length > 7200) {
|
||||||
|
settings.granularity = 15
|
||||||
|
} else if (lines.length > 3600) {
|
||||||
|
settings.granularity = 5
|
||||||
|
} else {
|
||||||
|
settings.granularity = 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// First, let's merge headers and groups in a single object
|
// First, let's merge headers and groups in a single object
|
||||||
xValues = getValues(graphs, 'system', 'time');
|
xValues = getValues(graphs, 'system', 'time');
|
||||||
/* Use time for XAxis */
|
/* Use time for XAxis */
|
||||||
@ -182,7 +200,8 @@ function processCSV(csv, filename) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Then, populate the graphs object with the CSV values */
|
/* Then, populate the graphs object with the CSV values, aggregate data while browsing */
|
||||||
|
tmp_values = {}
|
||||||
for (var lindex = l_env.dataIn, iindex = 0; lindex < lines.length; lindex++, iindex++) {
|
for (var lindex = l_env.dataIn, iindex = 0; lindex < lines.length; lindex++, iindex++) {
|
||||||
line = lines[lindex].replace(/"/g, '').split(',');
|
line = lines[lindex].replace(/"/g, '').split(',');
|
||||||
for (var cindex = 0; cindex < line.length; cindex++) {
|
for (var cindex = 0; cindex < line.length; cindex++) {
|
||||||
@ -199,7 +218,22 @@ function processCSV(csv, filename) {
|
|||||||
graphs[lmap.group].yformat = d3.format('<-,02f');
|
graphs[lmap.group].yformat = d3.format('<-,02f');
|
||||||
}
|
}
|
||||||
|
|
||||||
graphs[lmap.group].d[lmap.index].values.push({y: val, x: xValues[iindex]});
|
if (tmp_values[lmap.group] == undefined) {
|
||||||
|
tmp_values[lmap.group] = []
|
||||||
|
}
|
||||||
|
if (tmp_values[lmap.group][lmap.index] == undefined) {
|
||||||
|
tmp_values[lmap.group][lmap.index] = []
|
||||||
|
}
|
||||||
|
tmp_values[lmap.group][lmap.index].push(val)
|
||||||
|
|
||||||
|
if (!((iindex + 1) % settings.granularity)) { // add a new entry in the graph
|
||||||
|
if (settings.agg_function == "avg") {
|
||||||
|
graphs[lmap.group].d[lmap.index].values.push({y: tmp_values[lmap.group][lmap.index].average(), x: xValues[iindex]});
|
||||||
|
} if (settings.agg_function == "max") {
|
||||||
|
graphs[lmap.group].d[lmap.index].values.push({y: Math.max(...tmp_values[lmap.group][lmap.index]), x: xValues[iindex]});
|
||||||
|
}
|
||||||
|
tmp_values = {}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -235,7 +269,7 @@ function processCSV(csv, filename) {
|
|||||||
dmin = graphs[1].d[1].values[0].x;
|
dmin = graphs[1].d[1].values[0].x;
|
||||||
dmax = graphs[1].d[0].values[graphs[1].d[0].values.length -1].x;
|
dmax = graphs[1].d[0].values[graphs[1].d[0].values.length -1].x;
|
||||||
// If there is many point, let's start by focusing on the last ones to reduce loading time
|
// If there is many point, let's start by focusing on the last ones to reduce loading time
|
||||||
if (lines.length > 500) {
|
if ((lines.length / settings.granularity) > 500) {
|
||||||
dmin = graphs[1].d[0].values[graphs[1].d[0].values.length - 500].x;
|
dmin = graphs[1].d[0].values[graphs[1].d[0].values.length - 500].x;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -512,6 +546,12 @@ function change_interface(type) {
|
|||||||
refresh();
|
refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function change_granularity(granularity, aggr_function) {
|
||||||
|
settings.granularity = granularity
|
||||||
|
settings.agg_function = aggr_function
|
||||||
|
refresh();
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Destroy all graphs & the focus bars
|
* Destroy all graphs & the focus bars
|
||||||
* and recreate them using the content of
|
* and recreate them using the content of
|
||||||
@ -538,3 +578,14 @@ function toggle_menu() {
|
|||||||
$('#dashboard').animate({ "padding-top": "-=50px" }, 'slow');
|
$('#dashboard').animate({ "padding-top": "-=50px" }, 'slow');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Type extension
|
||||||
|
*/
|
||||||
|
Array.prototype.sum = Array.prototype.sum || function() {
|
||||||
|
return this.reduce(function(sum, a) { return sum + Number(a) }, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
Array.prototype.average = Array.prototype.average || function() {
|
||||||
|
return this.sum() / (this.length || 1);
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user