Я работаю над sharp node module
для обработки изображений JPEG.
Как объяснено в этот вопрос , я боролся с использованием буферов при четкой обработке изображений.
Пройдя сквозную документацию, я понял, что острые объекты являются дуплексными потоками.
Таким образом, я решил использовать потоки вместо буферов для решения проблемы потребления памяти.
Я закончилдо создания [этого POC], который использует потоки для чтения и обработки файла jPG размером 30 Мб.
Однако я не смог добиться каких-либо улучшений производительности.
Реализация POC
POC создает настраиваемое преобразование и записываемый поток для расчета размера резкого изображения.
Окончательное использование выглядит следующим образом - Sharp Input Stream
|Custom Transform Stream
|Writable Stream
Подробные объяснения объясняются в следующих текстах:
Резкий входной поток
const imageFilePath = readFileSync("./30mb.jpg");
let image = sharp(imageFilePath);
Пользовательский поток преобразования
class SizeCalculator extends Transform {
constructor(options) {
super(options);
this.size = 0;
this.count = 0;
}
_transform(chunk, encoding, callback) {
console.log(++this.count); // count the chunks processed
chunk && chunk.length && (this.size += chunk.length);
callback();
}
_flush(callback) {
this.push(this.size.toString());
callback();
}
}
Записываемый поток
class ImageSize extends Writable {
constructor(options) {
super(options);
this.size = 0;
}
_write(chunk, encoding, callback) {
this.size = chunk.toString();
callback();
}
}
Использование
let image = sharp(imageFilePath);; // sharp image
const sizeTransform = new SizeCalculator(); // transform stream
const imageSize = new ImageSize(); // readable stream
imageSize.on("finish", () => console.log(imageSize.size)); // listen to finish event
image.pipe(sizeTransform).pipe(imageSize); // readable | transform | writable
Выводы
В потоке преобразования я подсчитываю количество чанков, необходимое для обработки 30 Мб. Изображение
В соответствии с API потоков, нормальный размер чанка составляет 65536
Однако только в этом случаеодин кусок обслуживает все изображение размером 30 Мбайт
И вот в чем проблема. Использование потоков становится бесполезным, поскольку поток одновременно удерживает весь файл в памяти.
ЧТО Я ПРОЧУ ЗДЕСЬ? ИЛИ ЭТО ПРОБЛЕМА С SHARP?
GitHub POC Repository
Я создал GitHub POC Repository , где эта проблема может быть воспроизведена.
Спасибо.