Note that there are some explanatory texts on larger screens.

plurals
  1. POMemory gradually increased using d3 for real time chart?
    primarykey
    data
    text
    <p>I tried to simulate a real time chart with dynamic data using <code>d3.js</code>. I am running this using IE-10 browser.</p> <p><a href="https://drive.google.com/file/d/0B6wTfkJvzke_YlUtTkR4dktpS3M/edit?usp=sharing" rel="nofollow">My Source Code</a></p> <p>I come across to a problem where the memory of my IE browser will be gradually increased if left the web application running for a period of time.</p> <p>I Google searched the possible reason that caused this problem. </p> <p>Two things come into my mind for discussion:</p> <ol> <li><p>The timer prevents the garbage collection of IE</p></li> <li><p>The d3 chart does not release memory after <code>data.shift()</code></p></li> </ol> <p><strong>My question:</strong></p> <ol> <li><p>How could I diagnose if my problem actually originated from discussion 1 or 2 or neither?</p></li> <li><p>How could I solve the memory problem?</p></li> </ol> <p>You might need to download the code and run it with some time and monitor the <code>iexplorer.exe</code> using resource monitor in order to identify the problem.</p> <p>Thank you.</p> <p>Source Code:</p> <pre><code>&lt;html&gt; &lt;head&gt; &lt;title&gt;Animated Sparkline using SVG Path and d3.js&lt;/title&gt; &lt;script src="http://mbostock.github.com/d3/d3.v2.js"&gt;&lt;/script&gt; &lt;style&gt; /* tell the SVG path to be a thin blue line without any area fill */ path { stroke: steelblue; stroke-width: 1; fill: none; } &lt;/style&gt; &lt;/head&gt; &lt;body&gt; &lt;span&gt; &lt;b&gt;Size:&lt;/b&gt; 300x30 &amp;nbsp;&amp;nbsp;&lt;b&gt;Interpolation:&lt;/b&gt; basis &amp;nbsp;&amp;nbsp;&lt;b&gt;Animation:&lt;/b&gt; true &amp;nbsp;&amp;nbsp;&lt;b&gt;Transition:&lt;/b&gt; 1000ms &amp;nbsp;&amp;nbsp;&lt;b&gt;Update Frequency:&lt;/b&gt; 1000ms &lt;div id="graph1" class="aGraph" style="width:300px; height:30px;"&gt;&lt;/div&gt; &lt;/span&gt; &lt;script&gt; var myTimer; function FeedDataToChart(id, width, height, interpolation, animate, updateDelay, transitionDelay, data, startIndex) { // create an SVG element inside the #graph div that fills 100% of the div var graph = d3.select(id).append("svg:svg").attr("width", "80%").attr("height", "80%"); // X scale will fit values from 0-10 within pixels 0-100 var x = d3.scale.linear().domain([0, 48]).range([10, width-10]); // starting point is -5 so the first value doesn't show and slides off the edge as part of the transition // Y scale will fit values from 0-10 within pixels 0-100 var y = d3.scale.linear().domain([0, 20]).range([height-10, 10]); // create a line object that represents the SVN line we're creating var line = d3.svg.line() // assign the X function to plot our line as we wish .x(function(d,i) { // verbose logging to show what's actually being done //console.log('Plotting X value for data point: ' + d + ' using index: ' + i + ' to be at: ' + x(i) + ' using our xScale.'); // return the X coordinate where we want to plot this datapoint return x(i); }) .y(function(d) { // verbose logging to show what's actually being done //console.log('Plotting Y value for data point: ' + d + ' to be at: ' + y(d) + " using our yScale."); // return the Y coordinate where we want to plot this datapoint return y(d); }) .interpolate(interpolation) var counter = startIndex; //var myData = data.slice(); // display the line by appending an svg:path element with the data line we created above graph.append("svg:path").attr("d", line(data)); // or it can be done like this function redrawWithAnimation() { // update with animation graph.selectAll("path") .data([data]) // set the new data .attr("transform", "translate(" + x(1) + ")") // set the transform to the right by x(1) pixels (6 for the scale we've set) to hide the new value .attr("d", line) // apply the new data values ... but the new value is hidden at this point off the right of the canvas .transition() // start a transition to bring the new value into view .ease("linear") .duration(transitionDelay) // for this demo we want a continual slide so set this to the same as the setInterval amount below .attr("transform", "translate(" + x(0) + ")"); // animate a slide to the left back to x(0) pixels to reveal the new value } function redrawWithoutAnimation() { // static update without animation graph.selectAll("path") .data([data]) // set the new data .attr("d", line); // apply the new data values } function stopTimer() { clearInterval(myTimer); myTimer = null; graph.selectAll("path").data([data]).remove().append("svg:path").attr("d", line); buffer = null; signalGenerator(); } function startTimer() { if (myTimer == null) { myTimer = setInterval(function() { if (counter &lt; data.length - 1) { var v = data.shift(); // remove the first element of the array data.push(v); // add a new element to the array (we're just taking the number we just shifted off the front and appending to the end) if(animate) { redrawWithAnimation(); } else { redrawWithoutAnimation(); } counter++; } else { //alert("no more data in buffer"); stopTimer(); counter = startIndex; } }, updateDelay); } } startTimer(); } var buffer; function signalGenerator() { if (buffer == null) { buffer = new Array(100); var i; for (i = 0; i &lt; buffer.length; i++) { buffer[i] = Math.random() * 10; } FeedDataToChart("#graph1", 300, 300, "basis", true, 100, 100, buffer, 0); } } function startGenerator() { signalGenerator(); } startGenerator(); &lt;/script&gt; &lt;/body&gt; &lt;/html&gt; </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload