Подтвердить что ты не робот

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 Выделение отказало - процесс из памяти

4b9b3361

Ответ 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.