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 reducir el alto uso de memoria con createReadStream cuando se conecta a la respuesta?

A continuación se encuentra el archivo app.js que estoy utilizando para experimentar con streams en un contenedor Docker de Oracle Linux 7 que está limitado a 4 GB de RAM.

El archivo large-file tiene alrededor de 1 GB de texto generado utilizando yes.

He configurado grafana con cadvisor para medir la memoria caché del contenedor durante todo el ciclo de solicitud.

const express = require(‘express’)
const fs = require(‘fs’)
const app = express()
const port = 3000

app.get(‘/’, (req, res) => {
let stuff = fs.createReadStream(‘./large-file’);
stuff.pipe(res);
})

app.listen(port, () => {
console.log(`Example app listening at http://localhost:${port}`)
})

Versión de Node: 14.18.1

A continuación se muestra el gráfico después de usar curl -o /dev/null localhost:3000. La caída anterior se debe a borrar la caché de la página mediante sync; echo 3 > /proc/sys/vm/drop_caches

https://i.stack.imgur.com/mcb9G.png

Tenía la impresión de que el uso de streams reduciría la huella de memoria, pero el gráfico parece mostrar lo contrario con todo el archivo se carga en el búfer. ¿Hay alguna manera de evitar lo mismo?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en javascript, node.js, linux, express y http, puedo explicar que aunque el uso de streams se pretende reducir la huella de memoria, el gráfico sugiere que el archivo completo está siendo cargado en el buffer. Esto podría deberse a algunas razones, como que el archivo es lo suficientemente pequeño como para caber en la memoria, o la forma en que se está utilizando el stream. Una forma de evitar cargar todo el archivo en la memoria es especificar un tamaño de segmento más pequeño al crear el ReadStream, por ejemplo:

    let stuff = fs.createReadStream('./large-file', { highWaterMark: 1024 })
    

    Esto leerá y enviará el archivo en segmentos más pequeños de 1024 bytes, lo que debería ayudar a reducir la huella de memoria. Además, también se podría intentar usar un stream de Transformación para modificar los datos sobre la marcha, lo que también puede ayudar a reducir el uso de memoria.

    Es importante tener en cuenta que medir el uso de memoria de manera precisa puede ser desafiante, especialmente en un ambiente contenerizado. El gráfico que proporcionaste muestra el uso de caché de memoria, lo que también puede ser afectado por otros procesos en el sistema. Se recomienda utilizar varias herramientas de monitoreo para tener una mejor imagen del uso de memoria real de tu aplicación.

Comments are closed.