Tengo un archivo con 2 matrices grandes, el archivo ocupa aproximadamente 2 GB. Quiero combinar ambas matrices por id. El problema es que las matrices son demasiado grandes. Por lo general, solo mapearía a través de arrayMain, tomaría la ID y luego filtraría arrayItems por esa ID. Creo que el problema es que almaceno todos los resultados en la memoria y no hay suficiente memoria para esta operación.
Así es como normalmente habría combinado ambas matrices y el resultado esperado:
const composed = arrayMain.map((d) => { return { ...d, data: arrayItems.filter(({ ID }) => d.ID === ID), }; }); const arrayMain = [ { ID: 30574062, number: 28234702, place: London, }, { ID: 30574063, number: 45232502, place: Paris, }, ... ]; const arrayItems = [ //Objects with the same ID are not necessarily next to one another. { "ID": 30574062, "anotherNumber": "52,3", "color": "red" }, { "ID": 30574062, "anotherNumber": "13", "color": "yellow" }, { "ID": 30574063, "anotherNumber": "60,6", "color": "blue" }, ... ] //expected result [ { ID: 30574062, number: 28234702, place: London, data: [ { "anotherNumber": "52,3", "color": "red" }, { "anotherNumber": "13", "color": "yellow" } ] }, { ID: 30574063, number: 45232502, place: Paris, data: [ { "anotherNumber": "60,6", "color": "blue" }, ] }, ... ]Si entiendo las transmisiones correctamente, tengo que mapear a través de arrayMain y tomar una identificación. Luego transmita objetos desde arrayItems y filtre esa transmisión según la ID. Después de eso, tengo que crear una secuencia de escritura para escribir los resultados en otro archivo.
const stream = fs.createReadStream(filepath) .pipe(composed()) //composed is a function in this case, idea is the same as above .pipe(filepath) //write data to a new file Solo escribir resultados produce Error: Cannot create a string longer than 0x3fffffe7 characters
const stream = fs.createWriteStream(filepath, { flags:'a' }); stream.write('['); const CHUNK_LENGTH = 20; for (let i = 0; i < composed.length; i += CHUNK_LENGTH) { const chunkStr = JSON.stringify( composed.slice(i, i + CHUNK_LENGTH) ); stream.write(chunkStr); } stream.write(']');