Question

Nous avons utilisé Drools dans le cadre d’une solution agissant comme une sorte de filtre dans une application de traitement très intense, pouvant exécuter jusqu’à 100 règles sur plus de 500 000 objets de mémoire de travail. s'avère qu'il est extrêmement lent. Quelqu'un d'autre a-t-il déjà utilisé Drools dans une application de traitement par lots?

Était-ce utile?

La solution

Je n'ai pas encore travaillé avec la dernière version de Drools (la dernière fois que je l'utilisais il y a environ un an), mais à cette époque, nos tests de performances à charge élevée prouvaient qu'elle était extrêmement lente. Une énorme déception après avoir basé une grande partie de notre architecture sur elle.

Au moins quelque chose de bon dont je me souvienne au sujet de drools, c’est que leur équipe de développement était disponible sur IRC et très utile. Vous pourriez peut-être essayer, ils sont les experts après tout: irc.codehaus.org #drools

Autres conseils

Le genre de dépend de vos règles - 500K objets est raisonnable compte tenu de suffisamment de mémoire (il doit remplir un réseau RETE en mémoire, de sorte que l'utilisation de la mémoire est un multiple de 500K objets - c'est-à-dire un espace pour les objets + un espace pour la structure du réseau, les index, etc. ) - il est possible que vous pagiez sur le disque, ce qui serait très lent.

Bien sûr, si vous avez des règles qui correspondent à des combinaisons du même type de fait, cela peut entraîner une explosion de combinaisons à essayer, qui même si vous avez 1 règle sera vraiment très lent. Si vous disposiez de plus d'informations sur l'analyse que vous réalisez, cela vous aiderait probablement avec les solutions possibles.

J'ai utilisé un Drools avec une mémoire de travail contenant plus d'un million de faits. Avec quelques ajustements de vos règles et de la JVM sous-jacente, les performances peuvent être plutôt bonnes au bout de quelques minutes pour le démarrage initial. Faites-moi savoir si vous souhaitez plus de détails.

J'apprends juste à baver moi-même, alors peut-être qu'il me manque quelque chose, mais pourquoi l'ensemble des cinq cent mille objets est-il ajouté à la mémoire de travail à la fois? La seule raison pour laquelle je peux penser est qu’il existe des règles qui ne s’appliquent que lorsque deux ou plusieurs éléments du lot sont liés.

Si ce n'est pas le cas, vous pourriez peut-être utiliser une session sans état et affirmer un objet à la fois. Je suppose que les règles seront exécutées 500 000 fois plus rapidement dans ce cas

Même si c'est le cas, toutes vos règles ont-elles besoin d'un accès à tous les objets 500k? Pourriez-vous accélérer les choses en appliquant une à une les règles par élément, puis dans une deuxième phase de traitement, appliquez des règles au niveau du lot en utilisant une base de règles et une mémoire de travail différentes? Cela ne changerait pas le volume de données, mais le réseau RETE serait plus petit car les règles simples auraient été supprimées.

Une autre approche serait d’essayer d’identifier les groupes d’objets liés et d’affirmer les objets en groupes au cours de la deuxième phase, en réduisant davantage le volume de données en mémoire de travail et en divisant le réseau RETE.

Drools n’est pas vraiment conçu pour être exécuté sur un très grand nombre d’objets. Il est optimisé pour l'exécution de règles complexes sur quelques objets.

L'initialisation de la mémoire de travail pour chaque objet supplémentaire est trop lente et les stratégies de mise en cache sont conçues pour fonctionner par objet de mémoire de travail.

J'ai eu des problèmes avec les erreurs OutOfMemory après l'analyse de quelques milliers d'objets. La définition d’un autre optimiseur par défaut a résolu le problème.

OptimizerFactory.setDefaultOptimizer(OptimizerFactory.SAFE_REFLECTIVE);

Nous examinions aussi les bave, mais pour nous le nombre d'objets est faible, donc ce n'est pas un problème. Je me souviens avoir lu qu'il existe plusieurs versions du même algorithme qui prennent davantage en compte l'utilisation de la mémoire et qui sont optimisées pour la vitesse tout en restant basées sur le même algorithme. Je ne sais pas si certains d’entre eux en ont fait une véritable bibliothèque utilisable.

Utilisez une session sans état et ajoutez les objets un à un?

cet optimiseur peut également être réglé en utilisant le paramètre -Dmvel2.disable.jit = true

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top