Острый дуплексный поток излучает куски крупнее 65536 - PullRequest
0 голосов
/ 20 октября 2019

Я работаю над 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 , где эта проблема может быть воспроизведена.

Спасибо.

...