2009-07-25 6 views
0

Ich schreibe gerade eine Anwendung mit Drools 5.0. Diese Anwendung scheint ein wenig langsam zu laufen, aber ich habe eine Theorie warum. Diese Anwendung empfängt viele Aktualisierungen für Fakten, die bereits in der Wissenssitzung gespeichert sind. Die Drools-Update-Funktion unter der Haube macht wirklich einen Rückzug und dann einen Einschub. Diese Anwendung hat über 200 Regeln. Einige der Regeln werden ausgelöst, wenn bestimmte Fakten entfernt werden. Andere Regeln werden geschrieben, wenn bestimmte Fakten in der Wissenssitzung bestätigt werden. Da das Update wirklich eine Retraktion durchführt, werden die retraktions- und einführungsbezogenen Regeln während eines Updates noch ausgelöst? Auch wenn nichts wirklich in die Wissenssitzung "eingefügt" oder zurückgezogen wird?Könnte die Drools-Update-Methode möglicherweise meine Probleme verursachen

Eine Sache zu beachten, ich 'angehängt' den WorkingMemoryFileLogger zu meiner Wissens-Session, um eine bessere Vorstellung von dem, was los ist. Damals sah ich viele unerwartete Retraction/Insertion-Regelaktivierungs-Kreationen, die der Agenda hinzugefügt wurden, aber anscheinend werden sie nie aktiviert. Es scheint mir, dass das Aktualisieren von Fakten, insbesondere aufgrund Ihres Faktenmodells, teuer sein kann und ich sparsam eingesetzt werden sollte. Ist das richtig?

Antwort

0

Ich denke, Sie haben es richtig verstanden. Ein Update ist wie ein Retract plus eine Assert. Die erste Sache, um sicher zu sein, ist, wenn Ihre Regeln Ihnen geben, was Sie wollen - dh funktioniert es, aber Sie wollen nur die Leistung verbessern?

In mancher Hinsicht kann man sich ein Update vorstellen (und auch das Schlüsselwort "modify" auschecken) als Teil der Unveränderlichkeit;) Wenn Sie aktualisieren - sagen Sie dem Netzwerk, dass sich die Tatsache geändert hat, aber es verfolgt es noch nicht auf einer Feldebene (das ist TBD), so dass es mehr Arbeit verursachen kann, als notwendig ist, da alle diese Aktivierungen erzeugt werden, die nicht wirklich benötigt werden (da sie Felder verwenden, die sich nicht im Wert geändert haben) .

Es ist schwer, genauer zu sein - wenn Sie einige Beispielregeln/Faktenmodelle zur Verfügung gestellt haben (wenn Sie das natürlich sicher tun können!), Könnten wir Ihnen einige Ideen vorschlagen, um sie granularer zu machen.

Viel Glück!

+0

Danke für die Antwort Michael. Du hast meinen Verdacht bestätigt. Der Motor scheint korrekt zu funktionieren, aber meine Antworten sind latent, weil es zu lange dauert, alle Regeln/Fakten zu verarbeiten. Ich habe ein paar Ideen, wie ich das Faktenmodell umgestalten kann, aber ich wollte sicherstellen, dass ich mich auf das richtige Problem konzentriere, da meine Refactoring-Bemühungen eine Weile dauern können. Danke nochmal! – loyalBrown

0

Der beste Weg zu wissen ist, die App zu profilieren und herauszufinden, was genau passiert. Verwenden Sie etwas wie OptimizeIt oder JProbe in Kombination mit der jvisualvm.exe, die mit JDK 1.6 ausgeliefert wird. Raten Sie nicht - holen Sie sich mehr Daten.

+0

Ich habe bereits meine Anwendung profiliert. Die meiste Zeit verbringe ich mit dem Aufruf von fireAllRules, der Teil der Drools-Schnittstelle ist. Wie dieser Aufruf ausgeführt wird, hängt von meinem Regelentwurf und Faktenmodell ab. Ich hatte gehofft, dass jemand, der ein tieferes Verständnis der ReteOO-Implementierung in Drools hat als ich, einen Einblick geben könnte, was genau passiert, wenn Fakten aktualisiert werden, anstatt behauptet zu werden. Sag mir auch, wie sich das auf den Aufruf von fireAllRules auswirken könnte. – loyalBrown

0

Meiner Erfahrung nach ist die update() - Methode nur erforderlich, wenn Sie eine Entität benötigen, die von der WHERE-Klausel im Kontext der aktuell ausgeführten Regel neu bewertet wird. Da die RETE-Auswertung nach dem Eintragen der Regel auf einmal erfolgt, wird das Ausführen einiger update() - Anweisungen (wo dies möglich ist) beschleunigt. Manchmal müssen einige Flags gesetzt und das echte update() auf eine spätere Regel verschoben werden. Sie können auch einen Teil der Auswertung der aktuellen Entitätszustände in eine if-Anweisung in der THEN-Klausel einfügen, wobei Sie die WHERE-Klausel für eine grundlegendere Filterung verwenden.