У меня проблема с потоками / буферами Node.js, когда они не закрываются / не очищаются после первого использования.У меня есть поток чтения, созданный из fs.createReadStream
, который я передаю в пользовательский поток записи.highWaterMark
для каждого чанка составляет ~ 2 МБ (это важно).Когда я сначала передаю поток через файл ~ 3 МБ, он обрабатывается моим потоком в 2 блока, сначала блоком ~ 2 МБ, затем блоком ~ 1 МБ.Это ожидается.
Во втором файле, который я передаю, первый блок занимает всего ~ 1 МБ.Это проблема.Когда я складываю переданные байты, я вижу, что после первого файла ясно, что связанные потоки / буферы не были очищены должным образом.Это можно показать с помощью следующей математики:
Конечный фрагмент, который передается из первого файла, составляет 875 837 байт.Первый блок передаваемого файла next составляет 1221 316 байт (ожидается: 2 097 152 байт).Когда вы добавляете 875 837 к 1 211 316, вы получаете 2 097 153, что является высшей отметкой, о которой я упоминал ранее (с отключением на одну ошибку).
Вот код, который я получил:
return new Promise(async (resolve, reject) => {
const maximalChunkedTransferSize = 2*1024*1024; // 2MB (Minimum amount, Autodesk recommends 5MB).
const pathToFile = await bucketManagement.locationOfBucketZip(bucketEntity.name);
let readFileStream = fs.createReadStream(pathToFile, { highWaterMark: maximalChunkedTransferSize });
let writeStream = new HttpAutodeskPutBucketObjectWriteStream(accessToken, bucketEntity);
readFileStream.pipe(writeStream);
writeStream.on("finish", () => {
resolve(writeStream.urn);
});
writeStream.on("error", err => reject("Putting the file into the bucket failed. " + err.message));
});
Я пытался вызвать .destroy()
в потоке чтения и записи.Я пытался позвонить .end()
, .unpipe()
.Ни один из них не сработал.Как я могу уничтожить / очистить поток и / или нижележащий буфер так, чтобы первый блок следующего файла был ожидаемым 2 МБ?