views:

78

answers:

3

Let me make immediately clear: this is not a question about memory leak! I have a page which allows the user to enter some data and a JavaScript to handle this data and produce a result. The JavaScript produces incremental outputs on a DIV, something like this:

(function()
{
   var newdiv = document.createElement("div");
   newdiv.innerHTML = produceAnswer();
   result.appendChild(newdiv);
   if (done) {
      return;
   } else {
      setTimeout(arguments.callee, 0);
   }
})();

Under certain circumstances the computation will produce so much data that IE8 will fail with this message:

not enough storage when dealing with too much data

The question is: is there way I can work out how much data is too much data?

as I said there is no bug to solve. It's a genuine out of memory because the computation requires to create too many DIVs.

My idea would be to run a function before executing the computation to work out ahead if the browser will succeed. But to do so, in a generic way, I think I need to find the memory available to my browser.

Any suggestion is welcome.

A: 

I suspect having a 0 timeout delay is the problem - it's trying to re-run instantly. Try increasing this.

graphicdivine
no it's not. the 0 timeout delay is a well known technique. google around if you don't believe me.
lorenzo 72
A: 

A loop will use less memory than recursion.

   do
   {
     var newdiv = document.createElement("div");
     newdiv.innerHTML = produceAnswer();
     result.appendChild(newdiv);
   } while (!done);

You could also put some upper limit on the number of answers produced.

   var answerCount = 0;
   do
   {
     var newdiv = document.createElement("div");
     newdiv.innerHTML = produceAnswer();
     result.appendChild(newdiv);
   } while (!done && answerCount++ < 1000);
Doug D
You have completely misunderstood the question. there is no recursion !!!-------------------------
lorenzo 72
Passing arguments.callee to setTimeout invokes the function again, but you are correct, it is not strictly recursion because the setTimeout allows the calling function to return (at least it should, but perhaps the delay=0 is optimized to call immediately, in which case it would be recursion).Using a loop with a counter will still help and the code will be easier to read.
Doug D
+1  A: 

Javascript (in the browser) is run in a sandbox, which means that it is fenced-off from accessing things that could cause security issues - local files, system resources etc - so no, you can't detect memory usage.

As the other answers state, you can make the task easier for the browser by pausing between implementations or using less resource-intensive code, but every browser has it's limits.

adam
thanks for your answer.I suspected that I could not detect memory usage.
lorenzo 72