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 - он пытается перезапуститься мгновенно. Попробуйте увеличить это.