Я использую imagemin-mozjpeg, который использует двоичный файл mozjpeg для сжатия изображений.
Проблема в том, что я использую его на веб-сервере nodejs.
Вот как это работает сейчас:
Я загружаю изображение в формате JPEG с помощью модуля «запрос» (fs.createReadStream).
Мультер обрабатывает поток потоком и сохраняет его в буфере (хранилище памяти).
Затем передайте буфер imagemin для сжатия.
Затем сжатый буфер записывается в файл. (пример.jpg)
Все работает.
Проблема здесь в том, что для каждого запроса создается новый дочерний процесс бинарного файла mozjpeg, cjpeg.
1 дочерний процесс потребляет 12,5 МБ памяти (для файла размером 0,5 МБ).
Если у меня есть 50 запросов одновременно, это составляет ~ 700 МБ, потому что для 50 изображений есть 50 дочерних процессов.
Есть ли способ ограничить количество дочерних процессов? (библиотека использует модуль «execa») или просто порождает 4-5 дочерних процессов, и они выполняют сжатие для всех запросов.
Спасибо
if (req.files.myimage[0].buffer) {
let fileNumber = filesUploaded++;
imagemin.buffer(req.files.myimage[0].buffer, {
plugins: [
imageminMozjpeg({ quality: 60, progressive: true })
]
})
.then(file => {
fs.writeFile(__dirname + '/uploads/' + uuidv4() + '.jpg', file, 'hex' , function () {
res.end("SUCCESS" + fileNumber.toString());
});
})
.catch(err => {
console.log(err);
res.end("FAILED");
});
}