JavaScript, чтобы найти доступную память - PullRequest
7 голосов
/ 08 января 2010

Давайте сразу проясним: это не вопрос утечки памяти! У меня есть страница, которая позволяет пользователю вводить некоторые данные и 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 ]

5 голосов
/ 08 января 2010

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

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

3 голосов
/ 31 марта 2015

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

document.write(performance.memory.jsHeapSizeLimit+'<br><br>');
document.write(performance.memory.usedJSHeapSize+'<br><br>');
document.write(performance.memory.totalJSHeapSize);
1 голос
/ 08 января 2010

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

   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 голосов
/ 08 января 2010

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

...