Nodejs из памяти
Сегодня я столкнулся с любопытной проблемой. Это может быть легким ответом для других, но он меня озадачивает. Почему приведенный ниже код вызывает ошибку памяти?
var cur = 167772160;
var bcast = 184549375;
var addresses = [];
while (cur <= bcast){
cur += 1;
addresses.push(cur);
}
addresses.length
addresses // memory goes from a few megs to over a gig in seconds when trying to print this
Я получаю одну из этих двух ошибок... первый, когда я запускаю этот код в интерпретаторе node, а второй, когда я запускаю его через nodeunit:
FATAL ERROR: CALL_AND_RETRY_2 Не удалось выполнить выделение - процесс из памяти
FATAL ERROR: JS Выделение отказало - процесс из памяти
Ответы
Ответ 1
Это происходит, когда я пытаюсь получить доступ к массиву.
Но получить длину нет.
> var cur = 167772160;
> var bcast = 184549375;
> var addresses = [];
> while (cur <= bcast){
... cur += 1;
... addresses.push(cur);
... }
16777216
> addresses.length
16777216
> addresses
FATAL ERROR: CALL_AND_RETRY_2 Allocation failed - process out of memory
Здесь еще один вопрос SO, предел памяти в Node.js(и chrome V8), который относится к проблеме с использованием памяти.
Ответ 2
Вы можете увеличить пределы по умолчанию, передав --max-old-space-size=<value>
, который находится в MB.
В примере допустимо использование кучи node до 4 ГБ (4096 мегабайт) памяти:
node --max-old-space-size=4096 app
Ответ 3
Я не получаю ошибку выделения памяти при запуске script. Сколько оперативной памяти находится в вашей системе?
Изменить
Хорошо с обновленными заметками автора, я могу воспроизвести его.
Node пытается преобразовать весь массив в строку. Массив имеет длину 16777216 элементов. Каждый элемент содержит число не менее 9 цифр. Преобразование этого в строку длиной 150 994 994 символов. Его просто огромная операция, превышающая возможности памяти node.