Процесс Node.js зависает при создании огромного объекта - PullRequest
0 голосов
/ 03 мая 2018

У меня есть процесс узла, который я использую для добавления значений ключа к объекту. Когда я получаю около 9,88 миллионов добавленных ключей, процесс зависает. Я предположил проблему нехватки памяти, поэтому я включил trace_gc, а также поставил галочку в коде, который добавляет ключи:

const { heapTotal, heapUsed } = process.memoryUsage()
if ((heapUsed / heapTotal) > 0.99) {
  throw new Error('Too much memory')
}

Это условие никогда не выполнялось, и ошибка не выдается. Что касается вывода --trace_gc, мой последний журнал очистки был:

[21544:0x104000000]  2153122 ms: Scavenge 830.0 (889.8) -> 814.3 (889.8) MB, 1.0 / 0.0 ms  allocation failure

Mark-sweep, однако, продолжает регистрировать это:

[21544:0x104000000]  3472253 ms: Mark-sweep 1261.7 (1326.9) -> 813.4 (878.8) MB, 92.3 / 0.1 ms  (+ 1880.1 ms in 986 steps since start of marking, biggest step 5.6 ms, walltime since start of marking 12649 ms) finalize incremental marking via task GC in old space requested

Соответствует ли этот вывод проблемам с памятью?

Я должен отметить, что добавление такого количества ключей к объекту - это крайний случай; обычно диапазон более вероятен в тысячах. Кроме того, ключи добавляются во время процесса потоковой передачи, поэтому я не знаю, сколько требуется добавить с самого начала. Поэтому в дополнение к попытке выяснить, в чем конкретно заключается проблема, я также ищу способ определить, что проблема, скорее всего, возникнет до зависания процесса.

...