Utilizamos Drools como parte de una solución para actuar como un tipo de filtro en una aplicación de procesamiento muy intensa, tal vez ejecutando hasta 100 reglas en más de 500,000 objetos de memoria en funcionamiento. resulta que es extremadamente lento. ¿alguien más tiene alguna experiencia en el uso de Drools en una aplicación de procesamiento por lotes?Uso de Drools en un proceso por lotes pesado
Respuesta
No he trabajado con la última versión de Drools (la última vez que la usé fue hace aproximadamente un año), pero en aquel momento nuestros puntos de referencia de alta carga demostraron que era completamente lenta. Una gran decepción después de haber basado gran parte de nuestra arquitectura en ella.
Al menos algo bueno que recuerdo de drools es que su equipo de desarrollo estaba disponible en el IRC y muy útil, es posible que les da una oportunidad, ellos son los expertos, después de todo: irc.codehaus.org #drools
Drools no está diseñado para ejecutarse en una gran cantidad de objetos. Está optimizado para ejecutar reglas complejas en algunos objetos.
La inicialización de la memoria de trabajo para cada objeto adicional es demasiado lenta y las estrategias de almacenamiento en caché están diseñadas para funcionar por objeto de memoria en funcionamiento.
Estábamos buscando drools también, pero para nosotros el número de objetos es bajo, así que esto no es un problema. Recuerdo haber leído que existen versiones alternativas del mismo algoritmo que tienen más en cuenta el uso de la memoria, y están optimizadas para la velocidad mientras que aún se basan en el mismo algoritmo. Sin embargo, no estoy seguro de si alguno de ellos se ha convertido en una verdadera biblioteca utilizable.
El tipo de objeto depende de la memoria (tiene que llenar una red RETE en memoria, por lo que el uso de memoria es un múltiplo de objetos 500K, es decir, espacio para objetos + espacio para estructura de red, índices etc.) - es posible que estés paginando en el disco, lo que sería muy lento.
Por supuesto, si tiene reglas que coinciden con combinaciones del mismo tipo de hecho, eso puede causar una explosión de combinaciones para probar, lo que incluso si tiene 1 regla será realmente muy lento. Si tiene más información sobre el análisis que está haciendo, probablemente lo ayude con posibles soluciones.
Estoy aprendiendo babas yo mismo, así que tal vez me falta algo, pero ¿por qué todo el lote de quinientos mil objetos se agrega a la memoria de trabajo a la vez? La única razón por la que puedo pensar es que hay reglas que se activan solo cuando dos o más elementos en el lote están relacionados.
Si ese no es el caso, entonces quizás podría usar una sesión sin estado y afirmar un objeto a la vez. Supongo que las reglas se ejecutarán 500 mil veces más rápido en ese caso.
Incluso si es el caso, ¿todas sus reglas necesitan acceso a todos los 500k objetos? ¿Podría acelerar las cosas aplicando las reglas por artículo de una en una, y luego en una segunda fase de procesamiento aplicar las reglas de nivel de lote utilizando una base de reglas y memoria de trabajo diferentes? Esto no cambiaría el volumen de datos, pero la red RETE sería más pequeña porque las reglas simples se habrían eliminado.
Un enfoque alternativo sería tratar de identificar los grupos de objetos relacionados y afirmar los objetos en grupos durante la segunda fase, reduciendo aún más el volumen de datos en la memoria operativa y dividiendo la red RETE.
¿Usa una sesión sin estado y agrega los objetos uno a la vez?
He usado un Drools con una memoria de trabajo con estado que contiene más de 1M de datos. Con un poco de ajuste tanto de sus reglas como de la JVM subyacente, el rendimiento puede ser bastante bueno después de unos minutos para la puesta en marcha inicial. Avísame si quieres más detalles.
Me interesan esos detalles, ¿podría compartirlos con nosotros? También estoy ejecutando Drools en un gran conjunto de datos y cualquier ajuste sería genial. –
Tuve problemas con los errores OutOfMemory después de analizar algunos miles de objetos. Establecer un optimizador predeterminado diferente resolvió el problema.
OptimizerFactory.setDefaultOptimizer(OptimizerFactory.SAFE_REFLECTIVE);
este optimizador también se puede configurar mediante el uso de parámetros -Dmvel2.disable.jit = true
- 1. ¿Cómo uso Drools Planner?
- 2. Esperando secuencias paralelas de proceso por lotes
- 3. Incluir un archivo por lotes en un archivo por lotes
- 4. ¿Por qué debería usar Drools?
- 5. Si condición en archivos de proceso por lotes
- 6. archivo de proceso por lotes: vaya al ciclo
- 7. Cómo esperar a que finalice un proceso para ejecutar otro proceso en el archivo por lotes
- 8. Proceso por lotes todos los archivos en el directorio
- 9. Ejecutando cadena variable como comando en el proceso por lotes
- 10. archivo de proceso por lotes de otros parámetros que pasan
- 11. Archivo por lotes de Windows: ¿PID del último proceso?
- 12. Ocultando una ventana de proceso por lotes simple
- 13. Volver a asociar archivos de proceso por lotes con Cmd.exe
- 14. mapeado de texturas a los objetos 3D en un proceso por lotes en el servidor
- 15. Uso de la CPU en el modo por lotes superior
- 16. ¿Cómo NO esperar a que se complete un proceso en un script por lotes?
- 17. Evitar que un proceso pesado se hunda en el archivo de intercambio
- 18. División de punto flotante en un archivo de proceso por lotes
- 19. ejecución y terminación de un proceso por lotes de larga duración en Python
- 20. ¿Cómo obtener un archivo de proceso por lotes para manejar espacios en nombres de archivo?
- 21. Iniciar un proceso en una nueva ventana desde un archivo por lotes
- 22. Script de proceso por lotes de Windows para imprimir mensaje de error si el puerto está en uso
- 23. Uso de drools expert con tablas dinámicas de decisión
- 24. Dentro de un archivo por lotes, ¿cómo puedo saber si se está ejecutando un proceso?
- 25. ¿Cómo comprobar si existe un archivo ejecutable en% PATH% desde un archivo de proceso por lotes de Windows?
- 26. ¿Uso de memoria de un proceso hijo?
- 27. Drools se activa en un bucle
- 28. Configuración del uso máximo de CPU por proceso en Windows
- 29. Cómo obtener un archivo de proceso por lotes de Windows UNIVERSAL timestamp
- 30. ¿Cómo esperar en un script por lotes?
nada nuevo para compartir .. ?? – Scoobie