Как предотвратить переполнение стека JavaScript? - PullRequest
2 голосов
/ 18 марта 2011

Я строил Жизнь Конвея с помощью javascript / jquery, чтобы запустить его в браузере Здесь . Chrome, Firefox и Opera или Safari делают это довольно быстро, поэтому желательно не использовать IE для этого. IE9 в порядке, хотя. Генерируя новые поколения Жизни, я сохраняю предыдущие поколения, чтобы иметь возможность вернуться в историю. Это работает нормально до определенного момента, когда память заполняется, что приводит к сбою браузера (вкладки).

Итак, мой вопрос: как я могу определить, когда память заполняется? Я храню массив для каждого поколения в массиве, который формирует историю поколений. Это занимает огромные объемы памяти, что приводит к сбою браузера через несколько тысяч поколений, в зависимости от доступной памяти. Мне известно о том, что JavaScript не может проверить объем доступной памяти, но должен быть способ ...

Ответы [ 2 ]

7 голосов
/ 18 марта 2011

Я сомневаюсь, что есть способ сделать это. Даже если и есть, это, вероятно, будет зависеть от браузера. Я могу предложить другой путь, хотя.

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

На самом деле, это на самом деле * не решает проблему, так как в конечном итоге вам не хватит места. Однако если вы сохраняете каждые n кадров, ваше приложение будет работать в n раз дольше, что может быть достаточно продолжительным. Я бы порекомендовал вам наложить жесткие ограничения на то, как далеко в прошлое вы можете перематывать, чтобы у вас было ограничение на то, сколько вы должны хранить. Определите, сколько будет кадров (10 минут при 30 кадрах в секунду = 18000 frames). Затем разделите frames на то, сколько кадров вы можете сохранить (профилируйте различные веб-браузеры, чтобы понять это), и это интервал между снимками, которые вы должны использовать.

0 голосов
/ 18 марта 2011

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

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

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

...