Tengo un archivo json y la estructura de ese archivo es la siguiente:
{ "orders":[ { "id": 876876876, "app_id":580714, "client_details": {}, "discount_codes": [{}], "line_items": [ { "id": 466157049, ... } ], ...... }, { "id": 47844583, "app_id":580714, "client_details": {}, "discount_codes": [{}], "line_items": [ { "id": 466157049, ... }], .... }, {...}, {...}, {...} ] }Esta matriz puede contener más de 10 lakhs (1 millón) de objetos. Actualmente necesito:
Estoy usando el siguiente código:
return new Promise((resolve, reject) => { var orders = [] var getStream = function () { var stream = fs.createReadStream(file_path, { encoding: 'utf8' }), parser = JSONStream.parse('*'); return stream.pipe(parser); }; getStream() .pipe(es.mapSync(function (data) { orders = data })) .on('end', function() { resolve(orders) }) })Pero hace que el sistema se cuelgue. Además, también he usado el siguiente comando:
node --max-old-space-size=8192 index.jsPero eso tampoco funcionó. ¿Alguien puede ayudarme a procesar un archivo json tan grande?
Editado : ahora el tamaño del archivo es de 850 MB y estoy usando el siguiente código:
return new Promise((resolve, reject) => { var data = '' var reader_stream = fs.createReadStream(file_path) reader_stream.setEncoding('UTF8') reader_stream.on('data', function(chunk) { data += chunk }) reader_stream.on('end',function() { try{ const orders_result = JSON.parse(data) var order_count = (orders_result.orders) resolve({ "count": order_count.length }) } catch(err) { console.log(err) } }) reader_stream.on('error', function(err) { console.log(err.stack) reject(err.stack) }) })y obteniendo el siguiente error
Excepción no detectada: RangeError: longitud de cadena no válida
JSON.parse necesita leer todo el archivo en la memoria, incluidas las partes que su aplicación no necesita. Un enfoque sería usar un analizador tipo SAX como clarinete . Estos analizadores no leen todo el archivo en la memoria, generan eventos durante el proceso de análisis. Debe manejar estos eventos para verificar si los datos son de interés y solo almacenar la información que realmente necesita.
Esto reducirá la cantidad de memoria requerida para el proceso de análisis, pero no es tan conveniente. Parece que su operación no necesita todos los datos, por lo que tal vez tenga suerte y una versión simplificada pueda caber en la memoria.