Потоки NodeJS - недостаточно памяти - PullRequest
0 голосов
/ 06 февраля 2019

Я экспериментировал с потоками nodejs и наткнулся на что-то странное, на мой взгляд.

Труба для записи

const {
  Writable,
  Readable
} = require('stream');

const myWritable = new Writable({
  write(chunk, encoding, callback) {
    callback()
  },
});

const myReadable = new Readable({
  read() {
    this.push(Buffer.from([1, 2, 3, 4, 5, 6]))
  }
});

myReadable.pipe(myWritable);

Этот, казалось бы, безвредный код вызывает линейное увеличение памяти и через 10 секундпроцесс останавливается с ошибкой нехватки памяти.

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory

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

Передать в файл

const {
  Readable
} = require('stream');

const myWritable = require('fs').createWriteStream('/dev/null')

const myReadable = new Readable({
  read() {
    this.push(Buffer.from([1, 2, 3, 4, 5, 6]))
  }
});

myReadable.pipe(myWritable);

В этом сценарии, чтоНа самом деле write использует файловую систему, процесс работает без каких-либо значительных затрат памяти.

Итак, есть мысли о том, что происходит под капотом?

...