es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo limitar el tamaño de cada lectura de un ReadableStream.

Estoy accediendo a un archivo desde el almacenamiento de mi dispositivo utilizando la entrada de archivo HTML, luego leo ese archivo como un flujo.

  • ¿Hay alguna forma incorporada de limitar la longitud de cada lectura a un número específico de bytes?
const stream = myFile.stream()
const reader = stream.getReader();

// En realidad, uso esto cada vez que quiero leer más datos del flujo
reader.read().then(function({ done, value }) {

const bufferSizeInBytes = value.length // Quiero limitar esto a 1000 bytes como máximo

})

Otra pregunta que me confunde: ¿por qué obtenemos una tamaño diferente del búfer en cada lectura? ¿Depende de la memoria disponible o de la CPU o cómo funciona en realidad? Si dependiera 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 aproximadamente 6 GB, pero en realidad tomó muchas lecturas, lo que me hizo pensar que la memoria no es el único factor detrás de esta operación.

Cualquier ayuda sería muy apreciada.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, hay una forma incorporada de limitar la longitud de cada lectura a un número específico de bytes. En el método reader.read(), puedes pasar un objeto con una propiedad size para especificar el número máximo de bytes que se leerán en cada llamada.

    Aquí tienes un ejemplo:

    const stream = myFile.stream(); 
    const reader = stream.getReader();
    
    const maxSize = 1000; // número máximo de bytes a leer
    
    // bucle para leer los datos del stream en fragmentos de maxSize bytes
    function readNextChunk() {
      reader.read({ size: maxSize }).then(function({ done, value }) {
        if (done) {
          // hacer algo si hemos llegado al final del stream
          return;
        }
    
        const buffer = value.buffer.slice(0, maxSize); // cortar el buffer hasta maxSize bytes
        // procesar el buffer aquí
        // ...
    
        readNextChunk(); // leer el siguiente fragmento de datos
      });
    }
    
    readNextChunk(); // empezar a leer el stream
    

    En cuanto a tu segunda pregunta, el tamaño de cada buffer devuelto por reader.read() depende de la cantidad de datos disponibles en el buffer del stream en ese momento. El navegador obtiene los datos del archivo en fragmentos y los almacena en un buffer. Cuando llamas a reader.read(), devuelve los datos que están actualmente en el buffer, hasta el tamaño máximo especificado en la opción size.

    El tamaño del buffer puede variar dependiendo de varios factores, como el tamaño de los fragmentos obtenidos por el navegador, la velocidad del disco y la memoria disponible. En general, el navegador intentará optimizar el tamaño de los fragmentos para reducir las operaciones de E/S y mejorar el rendimiento.

Comments are closed.