Tengo una función de flecha que obtiene dos matrices como parámetros y luego, en ciertas condiciones, empujo elementos de la segunda matriz a la primera matriz
El problema es que tengo una gran cantidad de datos que debo enviar y res.send puedo esperar mientras finaliza el ciclo y me envía un error sobre la memoria JavaScript heap out of memory
¿Cómo puedo esperar mientras mi ciclo termina y hacer que el ciclo funcione más rápido? Solo intento con async/await, promiseAll, para esperar
let mergeById = async(arr1, arr2) => { arr1.map(async(item) => { item.properties = []; await arr2.map(async(prop) => { if (item.item_id == prop.item_id) { await item.properties.push(prop); } }) }) return arr1 } async someFunction(req, res) { arr1 = dataItems(); //6000 items arr2 = dataProps(); //60000 items let result = await mergeById(arr1, arr2); res.json({ data: result }) }Tiene un mapa dentro del mapa, por lo tanto, para cada elemento en la matriz 1 iterará en toda la matriz 2. Ha encontrado una complejidad O(n^2) y, como puede ver, incluso con 66 000 elementos (que no es mucho para la computadora en propio), se está encontrando con un gran impacto. Porque tienes que hacer 6 000 * 60 000 = 360 000 000 iteraciones
Hay una solucion. Debe realizar un preprocesamiento: cree new Map() para array2, itere sobre todos los elementos y guarde item_id como una clave con valor true . Algo así como array2Map.set(prop.item_id, prop)
Luego cambia tu ciclo para consultar tu mapa
arr1.map(async(item) => { item.properties = []; const prop = array2Map.get(item.item_id); if (prop) { item.properties.push(prop) } Ahora tiene una complejidad O(n * log n) (bueno, es casi O(n) debido a la complejidad pseudo-lineal de los hashmaps, pero esa es una historia diferente, no es tan importante ahora). Y eso es lo suficientemente bueno para su caso de uso.
También hay otro problema con el uso de await y async . Simplemente elimine todo este uso de todo el código que ha presentado. No hace nada útil, pero en realidad rompe algunas cosas.
La función .map se ejecuta sincrónicamente sin importar si coloca la función async como parámetro. Simplemente creará una serie de promesas. A menos que sepa exactamente lo que está haciendo, mi consejo es que para las funciones de matriz (mapa, foreEach, reducir, etc.) nunca use la función asíncrona como parámetro, ya que en su mayoría no funcionará como espera.