JavaScript, чтобы найти доступную память

Давайте сразу проясним: это не вопрос утечки памяти! У меня есть страница, которая позволяет пользователю вводить некоторые данные и JavaScript для обработки этих данных и получения результата. JavaScript создает инкрементные выходные данные в DIV, что-то вроде этого:

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

При определенных обстоятельствах вычисление произведет так много данных, что IE8 потерпит неудачу с этим сообщением:

недостаточно места для хранения слишком большого количества данных

Вопрос: есть ли способ узнать, сколько данных слишком много данных?

как я уже сказал, нет ошибки, чтобы решить. Это действительно нехватка памяти, потому что вычисления требуют создания слишком большого количества HTML-элементов.

Моя идея состояла бы в том, чтобы запустить функцию перед выполнением вычислений для дальнейшей работы, если браузер преуспеет. Но для этого, в общем, я думаю, что мне нужно найти память, доступную для моего браузера.

Любое предложение приветствуется.

4 ответа

Решение

Javascript (в браузере) запускается в "песочнице", что означает, что он защищен от доступа к вещам, которые могут вызвать проблемы безопасности, такие как локальные файлы, системные ресурсы и т. Д., Поэтому нет, вы не можете обнаружить использование памяти.

Как говорится в других ответах, вы можете упростить задачу для браузера, сделав паузу между реализациями или используя менее ресурсоемкий код, но у каждого браузера есть свои ограничения.

Поиграй с этим...

document.write(performance.memory.jsHeapSizeLimit+'<br><br>');
document.write(performance.memory.usedJSHeapSize+'<br><br>');
document.write(performance.memory.totalJSHeapSize);

Цикл будет использовать меньше памяти, чем рекурсия.

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

Вы также можете установить верхний предел количества полученных ответов.

   var answerCount = 0;
   do
   {
     var newdiv = document.createElement("div");
     newdiv.innerHTML = produceAnswer();
     result.appendChild(newdiv);
   } while (!done && answerCount++ < 1000);

Я подозреваю, что проблема заключается в задержке тайм-аута 0 - он пытается перезапуститься мгновенно. Попробуйте увеличить это.

Другие вопросы по тегам