Estoy accediendo a un archivo desde el almacenamiento de mi dispositivo usando la entrada de archivo HTML y luego leo ese archivo como una secuencia.
const stream = myFile.stream() const reader = stream.getReader(); //actually I use this each time I want to read more data from the stream reader.read().then(function({ done, value }) { const bufferSizeInBytes = value.length // I want to limit this to 1000 bytes as max value }) Otra pregunta que me confunde, ¿por qué obtenemos un tamaño diferente del búfer en cada lectura? ¿Depende de la memoria o la CPU disponibles o cómo funciona realmente? si depende de la memoria, podríamos leer todo el flujo en una sola lectura, ya que el archivo tiene alrededor de 100 mb y mi memoria disponible es de alrededor de 6 GB, pero en realidad tomó muchas lecturas, lo que me hizo pensar que la memoria no es la único factor detrás de esta operación.
cualquier ayuda sería muy apreciada.
No, actualmente no puede controlar el tamaño del fragmento del lector del flujo de archivos predeterminado, puede intentar transformarlo en un ByteStream, luego use stream.getReader({ mode: 'byob' }) para obtener un lector BYOB para controlar el tamaño de lectura límite.
Más información: https://web.dev/streams/
Una forma es crear un ReadableStream intermedio que tendrá un búfer, una vez que el búfer exceda el tamaño de chunkSize deseado, luego se pone en cola (o si estamos en la última parte y solo queda una parte que es <tamaño de fragmento).
Como esto:
const reader = readable.getReader(); const chunkSize = 1 * 1024 * 1024 // 1MB let buffer: Uint8Array; const readableWithDefinedChunks = new ReadableStream({ async pull(controller) { let fulfilledChunkQuota = false; while (!fulfilledChunkQuota) { const status = await reader.read(); if (!status.done) { const chunk = status.value; buffer = new Uint8Array([...(buffer || []), ...chunk]); while (buffer.byteLength >= chunkSize) { const chunkToSend = buffer.slice(0, chunkSize); controller.enqueue(chunkToSend); buffer = new Uint8Array([...buffer.slice(chunkSize)]); fulfilledChunkQuota = true; } } if (status.done) { fulfilledChunkQuota = true; if (buffer.byteLength > 0) { controller.enqueue(buffer); } controller.close(); } } }, });