Tengo un archivo que almacena muchos objetos JavaScript en formato JSON y necesito leer el archivo, crear cada uno de los objetos y hacer algo con ellos (insertarlos en un db en mi caso) . Los objetos de JavaScript se pueden representar un formato:Parse archivo JSON grande en Nodejs
Formato A:
[{name: 'thing1'},
....
{name: 'thing999999999'}]
o Formato B:
{name: 'thing1'} // <== My choice.
...
{name: 'thing999999999'}
Tenga en cuenta que la ...
indica una gran cantidad de objetos JSON. Soy consciente de que podía leer el archivo en la memoria y luego usar JSON.parse()
así:
fs.readFile(filePath, 'utf-8', function (err, fileContents) {
if (err) throw err;
console.log(JSON.parse(fileContents));
});
Sin embargo, el archivo puede ser muy grande, yo prefiero usar una corriente de lograr esto. El problema que veo con una transmisión es que el contenido del archivo se puede dividir en fragmentos de datos en cualquier punto, entonces, ¿cómo puedo usar JSON.parse()
en dichos objetos?
Idealmente, cada objeto se leería como un fragmento de datos por separado, pero no estoy seguro de cómo hacerlo en .
var importStream = fs.createReadStream(filePath, {flags: 'r', encoding: 'utf-8'});
importStream.on('data', function(chunk) {
var pleaseBeAJSObject = JSON.parse(chunk);
// insert pleaseBeAJSObject in a database
});
importStream.on('end', function(item) {
console.log("Woot, imported objects into the database!");
});*/
Nota, deseo evitar la lectura de todo el archivo en la memoria. La eficiencia del tiempo no me importa. Sí, podría intentar leer una serie de objetos a la vez e insertarlos todos a la vez, pero eso es un ajuste de rendimiento: necesito una forma que garantice que no se produzca una sobrecarga de memoria, sin importar cuántos objetos contenga el archivo .
Puedo elegir usar FormatA
o FormatB
o tal vez alguna otra cosa, solo por favor especifique en su respuesta. ¡Gracias!
Para el formato B, puede analizar el fragmento de nuevas líneas y extraer cada línea completa, concatenando el resto si se corta en el medio. Sin embargo, puede haber una manera más elegante. No he trabajado mucho con las transmisiones. – travis