ERR_WORKER_OUT_OF_MEMORY в nodejs рабочих потоках - PullRequest
0 голосов
/ 16 апреля 2020

Я получаю сообщение об ошибке Error [ERR_WORKER_OUT_OF_MEMORY]: worker terminated due to reaching memory limit, когда пытаюсь запустить nodejs рабочие потоки в среде windows с ограниченными ресурсами.

  1. Каков предел памяти на поток по умолчанию?
  2. Можно ли его увеличить?

Спасибо.

1 Ответ

2 голосов
/ 16 апреля 2020

См. Параметр resourceLimits , который можно передать конструктору Worker.

Цитирование из do c:

resourceLimits <Object>

Необязательный набор ограничений ресурсов для нового экземпляра механизма JS. Достижение этих ограничений приведет к прекращению работы экземпляра Worker. Эти ограничения влияют только на движок JS, и никакие внешние данные, включая ArrayBuffers. Даже если эти ограничения установлены, процесс все равно может прерваться, если он столкнется с глобальной ситуацией нехватки памяти.

maxOldGenerationSizeMb Максимальный размер основной кучи в МБ.

maxYoungGenerationSizeMb Максимальный размер пространства кучи для недавно созданных объектов.

codeRangeSizeMb Размер предварительно выделенного диапазона памяти, используемого для сгенерированного кода.

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

Я бы добавил, что nodejs не особенно эффективна для использования памяти при попытке вписаться в цель с ограниченными ресурсами. Он хранит в памяти вещи, которые, вероятно, на самом деле не нужны, как и весь исходный код, который он компилирует. Его характер G C дает ему более широкий диапазон использования памяти, чем выделение вручную. Это также особенно плохо при одновременном чтении больших наборов данных и разборе их на множество небольших строк, так как это может привести к высокому пиковому использованию памяти, даже при том, что многие из них получают мусор, когда все успокаивается.

Как В другом примере вы можете прочитать / проанализировать файл размером 10 МБ JSON, и он будет занимать 10-кратный объем памяти для хранения данных Javascript. Это вовсе не обвинение в nodejs (я большой поклонник), но нужно быть более осторожным с тем, как вы используете инструмент, если вы пытаетесь вписаться в меньшие объемы памяти. Рабочий поток - это куча дополнительных затрат памяти (это своя куча, собственный скомпилированный код и т. Д. c ...), гораздо больше, чем в C / C ++.

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