Я экспериментировал с потоками 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 использует файловую систему, процесс работает без каких-либо значительных затрат памяти.
Итак, есть мысли о том, что происходит под капотом?