Feliz viernes :)
Estoy trabajando para almacenar matrices muy grandes de objetos (cientos de miles) en el disco usando NodeJS. Funciona muy bien en mi computadora portátil increíblemente rápida, sin embargo, el rendimiento en dispositivos más lentos es una consideración principal y pensé en dejar que ustedes lo prueben para ver si me estoy perdiendo algo obvio o estoy pasando por alto una mejor manera.
Nuestro objetivo final es poder comparar la matriz actual con la matriz anterior, por lo que necesitamos la actual y la anterior, pero solo queremos cargar los datos según sea necesario para mantener el uso de RAM lo más bajo posible cuando la aplicación está inactiva.
Tenemos que usar NodeJS y no podemos usar ninguna base de datos local, debe almacenarse como un archivo normal.
Esto es lo que se me ocurrió, usando Zlib:
let currentArray = [...] let previousArray = [] if(fs.existsSync('last.db')) { previousArray = JSON.parse(zlib.gunzipSync(fs.readFileSync('last.db')).toString('utf-8')) } fs.writeFileSync('last.db', zlib.gzipSync(JSON.stringify(currentArray)))Buscando pensamientos, impresiones, mejoras o café :D
¿Considera guardar como csv en lugar de una cadena JSON? Luego puede agregar cada fila editada a un archivo .csv, separados por comas
Entonces puedes leerlo como flujo usando csv rápido
La ventaja de esto es que no necesita leer toda la base de datos en una sola variable, porque escribir/leer el archivo completo como cadena->objeto->cadena
De hecho, creo que si usara fsPromises.appendFile , también puede agregar JSON.stringificar cada objeto individual como una línea separada en el archivo en lugar de clasificar toda la matriz de objetos,
Luego puede leer el archivo línea por línea https://nodejs.org/api/readline.html#readline_example_read_file_stream_line_by_line
He leído en un sitio web si carga un archivo completo (90 MB) en la memoria usando readFileSync, la memoria utilizada es de aproximadamente 224,5 MB . usar readline usa solo 6.33 MB , por lo que definitivamente es un gran aumento de rendimiento.
PD: no se pueden compartir enlaces en SO, pero si buscara en Google "node readline vs readfile", aparecerá primero.
Si el lujo de Internet está disponible, definitivamente cargaré todo en un atlas mongodb de nivel gratuito en lugar de un archivo local.