Pergunta

Nós usamos Drools como parte de uma solução para agir como uma espécie de filtro em um aplicativo de processamento muito intensa, talvez correndo até 100 regras em 500.000 + objetos de memória de trabalho. Acontece que é extremamente lento. ninguém tem alguma experiência usando Drools em um aplicativo de processamento de tipo de lote?

Foi útil?

Solução

Eu não tenho trabalhado com a mais recente versão do Drools (última vez que eu usei era cerca de um ano atrás), mas naquela época os nossos benchmarks de alta carga provou ser completamente lento. Uma enorme decepção depois de ter baseado muito de nossa arquitetura do mesmo.

Pelo menos algo de bom que me lembro sobre drools é que a sua equipe de desenvolvimento estava disponível no IRC e muito útil, você pode experimentá-los, eles são os especialistas depois de tudo: irc.codehaus.org #drools

Outras dicas

Kind of depende de suas regras - objetos 500K é dada memória bastante razoável (tem que preencher uma rede RETE na memória, por isso o uso de memória é um múltiplo de 500 mil objetos - espaço ie para objetos + espaço para estrutura de rede, índices etc ) - é possível que você está de paginação para o disco que seria muito lento.

Claro que, se você tem as regras que correspondem combinações do mesmo tipo de fato, que pode causar uma explosão de combinações para tentar, que mesmo se você tiver uma regra será realmente muito lento. Se você tivesse mais informações sobre a análise que você está fazendo isso provavelmente ajuda com possíveis soluções.

Eu usei um Drools com uma memória de trabalho stateful contendo mais fatos 1m. Com alguns ajustes de ambas as suas regras e a JVM subjacente, o desempenho pode ser muito bom depois de alguns minutos para start-up inicial. Deixe-me saber se você quiser mais detalhes.

Estou aprendendo drools mim mesmo, então talvez eu estou faltando alguma coisa, mas porque é que todo o lote de quinhentos mil objetos adicionados à memória de trabalho ao mesmo tempo? A única razão que eu posso pensar é que existem regras que chute em apenas quando dois ou mais itens do lote estão relacionados.

Se isso não for o caso, então talvez você poderia usar uma sessão sem estado e afirmar um objeto ao mesmo tempo. Presumo regras será executado 500k vezes mais rápido nesse caso.

Mesmo se for o caso, fazer todas as suas regras precisam ter acesso a todos os 500k objetos? você pode acelerar as coisas através da aplicação por item governa um de cada vez, e, em seguida, em uma segunda fase do tratamento aplicar regras nível de lote usando uma base de regra diferente e memória de trabalho? Isso não mudaria o volume de dados, mas a rede RETE seria menor porque as regras simples teria sido removido.

Uma abordagem alternativa seria a de tentar identificar os grupos relacionados de objectos e afirmar os objectos em grupos durante a segunda fase, reduzindo ainda mais o volume de dados na memória de trabalho, bem como a separação da rede RETE.

Drools não é realmente concebido para ser executado em um grande número de objetos. Ele é otimizado para a execução de regras complexas em alguns objetos.

A inicialização da memória de trabalho para cada objeto adicional é muito lento e as estratégias de cache são projetados para trabalhar por objeto memória de trabalho.

Eu tive problemas com erros de OutOfMemory após a análise de alguns milhares de objetos. A definição de um otimizador padrão diferente resolveu o problema.

OptimizerFactory.setDefaultOptimizer(OptimizerFactory.SAFE_REFLECTIVE);

Nós estávamos olhando para drools bem, mas para nós o número de objetos é baixa e isso não é um problema. Eu lembro de ter lido que existem versões alternativas do mesmo algoritmo que levam o uso de memória mais em conta, e são otimizados para a velocidade enquanto ainda está sendo baseada no mesmo algoritmo. Não tenho certeza se algum deles já alcançou uma biblioteca utilizável real embora.

Use uma sessão sem estado e adicionar os objetos de um de cada vez?

este otimizador também pode ser definido utilizando o parâmetro -Dmvel2.disable.jit = true

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top