Quiero analizar/procesar un archivo JSON de 25 MB usando Typescript y filtrar/ordenar los objetos. eficiente.
Nota: el código funcionó en un archivo pequeño
import fs from 'fs'; searchAccounts(): Promise<Account[]> { const accountSearchCriteria: AccountSearchCriteria = { country: 'NZ', mfa: 'SMS', name: 'TEST', sortField: 'dob' }; const jsonPath = './src/file.json'; const rawAccounts = fs.readFileSync(jsonPath, 'utf-8'); let accounts: Account[] = JSON.parse(rawAccounts); if (accountSearchCriteria) { if (accountSearchCriteria.name) { accounts = accounts.filter( account => account.firstName.toLowerCase() === accountSearchCriteria.name.toLowerCase() || account.lastName.toLowerCase() === accountSearchCriteria.name.toLowerCase() ); } if (accountSearchCriteria.country) { accounts = accounts.filter( account => account.country.toLowerCase() === accountSearchCriteria.country.toLowerCase() ); } if (accountSearchCriteria.mfa) { accounts = accounts.filter( account => account.mfa === accountSearchCriteria.mfa ); } if (accountSearchCriteria.sortField) { accounts.sort((a, b) => { return a[accountSearchCriteria.sortField] < b[accountSearchCriteria.sortField] ? -1 : 1; }); } return accounts; } return accounts; }
Dado que el tamaño de sus datos es de 25 MB, debe usar un algoritmo de clasificación más eficiente en memoria.
Puedes intentar usar ordenación cíclica.
Cycle-sort puede encontrar una implementación aquí y usarla en su código para ver si hay alguna diferencia.
Node.js es de subproceso único si su código bloquea el subproceso durante mucho tiempo, le dará un error de tiempo de espera. Hay dos problemas con su código.
fs.readFileSync(jsonPath, 'utf-8');
, es una función asíncrona y bloquea el hilo mientras lee el archivo. Use en su lugar fs.readFile('./Index.html', callback)
: const fs = require('fs'); fs.readFile('./Index.html', function read(err, data) { if (err) { throw err; } console.log(data); });
Nota: Node.js no es bueno con tareas centradas en la CPU, es decir, clasificación, procesamiento de imágenes, etc. Es bueno con tareas de E/S.