Domanda

Abbiamo utilizzato Drools come parte di una soluzione per agire come una sorta di filtro in un'applicazione di elaborazione molto intensa, magari eseguendo fino a 100 regole su oltre 500.000 oggetti della memoria di lavoro.risulta che è estremamente lento.qualcun altro ha esperienza nell'uso di Drools in un'applicazione di elaborazione di tipo batch?

È stato utile?

Soluzione

Non ho lavorato con l'ultima versione di Drools (l'ultima volta che l'ho usata è stata circa un anno fa), ma allora i nostri benchmark ad alto carico hanno dimostrato che era assolutamente lento.Una grande delusione dopo aver basato su di essa gran parte della nostra architettura.

Almeno qualcosa di buono che ricordo di drools è che il loro team di sviluppo era disponibile su IRC e molto utile, potresti provarli, dopotutto sono loro gli esperti: irc.codehaus.org #sbava

Altri suggerimenti

Dipende dalle tue regole: 500.000 oggetti sono ragionevoli data una memoria sufficiente (deve popolare una rete RETE in memoria, quindi l'utilizzo della memoria è un multiplo di 500.000 oggetti, ovvero spazio per oggetti + spazio per struttura di rete, indici, ecc.) - è possibile che tu stia effettuando il paging su disco, il che sarebbe molto lento.

Naturalmente, se hai regole che corrispondono a combinazioni dello stesso tipo di fatti, ciò può causare un'esplosione di combinazioni da provare, che anche se hai 1 regola sarà davvero molto lenta.Se avessi ulteriori informazioni sull'analisi che stai effettuando, probabilmente ti aiuterebbero con le possibili soluzioni.

Ho usato un Drools con una memoria di lavoro con stato contenente oltre 1 milione di fatti.Con una certa messa a punto sia delle regole che della JVM sottostante, le prestazioni possono essere abbastanza buone dopo pochi minuti per l'avvio iniziale.Fammi sapere se vuoi maggiori dettagli.

Anch'io sto imparando a sbavare, quindi forse mi sfugge qualcosa, ma perché l'intero gruppo di cinquecentomila oggetti viene aggiunto alla memoria di lavoro contemporaneamente?L'unico motivo che mi viene in mente è che ci sono regole che entrano in gioco solo quando due o più elementi nel batch sono correlati.

Se così non fosse, forse potresti usare una sessione senza stato e affermare un oggetto alla volta.Presumo che in questo caso le regole verranno eseguite 500k volte più velocemente.

Anche se è così, tutte le tue regole richiedono l'accesso a tutti gli oggetti da 500.000?Potresti accelerare le cose applicando le regole per articolo una alla volta e quindi, in una seconda fase di elaborazione, applicare le regole a livello batch utilizzando una base di regole e una memoria di lavoro diverse?Ciò non cambierebbe il volume dei dati, ma la rete RETE sarebbe più piccola perché verrebbero rimosse le semplici regole.

Un approccio alternativo sarebbe quello di provare a identificare i relativi gruppi di oggetti e asserire gli oggetti in gruppi durante la seconda fase, riducendo ulteriormente il volume di dati nella memoria di lavoro e suddividendo la rete RETE.

Drools non è realmente progettato per essere eseguito su un numero enorme di oggetti.È ottimizzato per l'esecuzione di regole complesse su pochi oggetti.

L'inizializzazione della memoria di lavoro per ogni oggetto aggiuntivo è troppo lenta e le strategie di memorizzazione nella cache sono progettate per funzionare per oggetto della memoria di lavoro.

Ho avuto problemi con gli errori OutOfMemory dopo aver analizzato alcune migliaia di oggetti.L'impostazione di un ottimizzatore predefinito diverso ha risolto il problema.

OptimizerFactory.setDefaultOptimizer(OptimizerFactory.SAFE_REFLECTIVE);

Stavamo esaminando anche le sbavature, ma per noi il numero di oggetti è basso, quindi questo non è un problema.Ricordo di aver letto che esistono versioni alternative dello stesso algoritmo che tengono maggiormente conto dell'utilizzo della memoria e sono ottimizzate per la velocità pur essendo basate sullo stesso algoritmo.Non sono sicuro però che qualcuno di loro sia diventato una vera libreria utilizzabile.

Utilizzare una sessione senza stato e aggiungere gli oggetti uno alla volta?

Questo ottimizzatore può anche essere impostato utilizzando il parametro -dmvel2.disable.jit = true

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top