Necesito acelerar una búsqueda sobre alguna colección con millones de elementos. El predicado de búsqueda debe pasarse como argumento.
Me he estado preguntando si la solución más simple (al menos por ahora) no sería simplemente usar rutinas para la tarea.
La pregunta a la que me enfrento en este momento es cuántas corrutinas puedo crear a la vez. :D Como nota al margen, puede haber más de una búsqueda de este tipo ejecutándose al mismo tiempo.
¿Puedo hacer millones de rutinas (una para cada artículo) para cada búsqueda? ¿Debo decidir sobre alguna carga de trabajo por rutina (por ejemplo, 1000 elementos por rutina)? ¿Debería también decidir sobre algún límite para la cantidad de rutinas?
Tengo un conocimiento aproximado de las corrutinas y cómo funcionan realmente, sin embargo, no tengo idea de cuáles son las limitaciones de rendimiento de esta función.
¡Gracias!
El peso de la memoria de una corrutina se escala con la profundidad del seguimiento de la llamada desde el bloque constructor de la corrutina hasta el punto de suspensión. Cada llamada suspend fun agrega otro objeto de Continuation a una lista vinculada y esto se retiene mientras la rutina está suspendida. Una cifra aproximada para una instancia de Continuation es de 100 bytes.
Entonces, si tiene una profundidad de seguimiento de llamadas de, digamos, 5, eso equivale a 500 bytes por elemento. Un millón de artículos son 500 MB.
Sin embargo, a menos que su código de búsqueda implique operaciones de bloqueo que dejarían un subproceso inactivo, no obtendrá nada de las corrutinas. Su tarea se parece más a una instancia de paralelismo de datos y puede resolverla de manera muy eficiente utilizando la API java.util.stream (como lo señaló el usuario marstran en el comentario).
De acuerdo con la guía de inicio de rutinas de Kotlin , el ejemplo lanza 100 000 rutinas. Creo que lo que pretendes hacer es exactamente para lo que está diseñado kotlin coroutine.
Si no va a hacer muchas modificaciones en su colección, simplemente guárdela en un HashMap, de lo contrario, guárdela en un TreeMap. Entonces solo busque elementos allí. Creo que los métodos de búsqueda implementados allí están lo suficientemente optimizados para manejar un millón de elementos en un abrir y cerrar de ojos. No usaría coroutines en este caso.
Documentación (para Kotlin):
HashMap: https://developer.android.com/reference/kotlin/java/util/HashMap
TreeMap: https://developer.android.com/reference/kotlin/java/util/TreeMap