Array
(
    [0] => stdClass Object
        (
            [Votos_Balanceados] => 1
            [id] => 12707
            [titulo] => Performance ClientDataSet (Append)
            [dataCadastro] => DateTime Object
                (
                    [date] => 2009-12-08 12:53:35
                    [timezone_type] => 3
                    [timezone] => America/Sao_Paulo
                )

            [isFirstPost] => -1
            [idUsuario] => 196132
            [status] => A
            [isExample] => 
            [NomeUsuario] => PAULO VINíCIUS PONTES
            [Login] => pontespaulo
            [Apelido] => 
            [Foto] => 
            [Conteudo] => Pessoal,

identificamos o problema aqui. É o FieldByName e não o Append. Fizemos a substituição da função FieldByName pela propriedade Fields[n] e o problema foi resolvido.

Para vocês terem uma idéia tinhamos um processo aqui que gastava 18:46 min (com FieldByName) e passou a gastar 20 seg (com Fields[n]).

Não chegamos a avaliar a implementação do Kylix para a função FieldByName. E como o Kylix foi descontinuado vamos avaliar se continuaremos com ele, pois poderemos ter novas surpresas.

Obrigado pelas Dicas.
) )

Performance ClientDataSet (Append)

Paulo Pontes
   - 10 nov 2009

Tenho uma rotina implementada que utiliza ClientDataSet para armazenar registros de forma temporária. Os dados são extraídos de diversos SQL's, portanto não utilizo o Provider para preencher esse Client, faço um loop nos registros selecionados e adiciono cada registro através do Append.

Trata-se de um projeto console que precisa ser rodado no linux, então faço a compilação no Kylix 3.

Aí está o meu problema, a inserção do registro no ClientDataSet está muito lenta. Por exemplo, gasto 1 seg para selecionar os registros no banco (+/- 7.000) e 5min para armazena-los no ClientDataSet. Isso ocorre apenas para o projeto compilado no Kylix, o projeto compilado no Delphi é rápido.

Alguém já passou por um problema semelhante?

Valeu!

Post mais votado

Paulo Pontes
   - 08 dez 2009

Pessoal,

identificamos o problema aqui. É o FieldByName e não o Append. Fizemos a substituição da função FieldByName pela propriedade Fields[n] e o problema foi resolvido.

Para vocês terem uma idéia tinhamos um processo aqui que gastava 18:46 min (com FieldByName) e passou a gastar 20 seg (com Fields[n]).

Não chegamos a avaliar a implementação do Kylix para a função FieldByName. E como o Kylix foi descontinuado vamos avaliar se continuaremos com ele, pois poderemos ter novas surpresas.

Obrigado pelas Dicas.

Guinther
|
MVP
Pontos: 5
    11 nov 2009

Dr Paulo

Tente desativar o log de alterações do CDS antes das operações:

ClientDataSet1.LogChanges := False;
...

Att,

Guinther Pauli
guinther.pauli@gmail.com
Editor Geral Revista ClubeDelphi
Editor Geral Revista .net Magazine Brasil
Microsoft Certified: MCP,MCAD,MCSD.NET,MCPD,MCTS
Delphi Certified: 3,5,6,7,2005,2006,Web,Kylix
http://guintherpauli.blogspot.com
http://twitter.com/guintherpauli

Paulo Pontes
   - 12 nov 2009

Guinther,

já fiz esse teste e não adiantou... tentei o MergeChangeLog a cada 100 registros incluídos, mas também não adiantou...

Será limitação do ClientDataSet do Kylix? (apesar de perceber que a compilação feita no Delphi também não tem boa performance não, mas a do Kylix que eu preciso é bem mais crítica).

Paulo Pontes
   - 17 nov 2009

Aparentemente o problema está no Kylix mesmo, encontrei problema de performance em outra situação:

Faço um loop em um ClientDataSet e dentro desse loop tenho uma pesquisa 'FindKey' em outro ClientDataSet (para executar alguns procedimentos), enquanto na compilação feita no delphi o tempo gasto foi de 1min na compilação do Kylix o tempo gasto foi de 21min.

Tenho alguma outra alteranativa para compilação desse projeto a não ser o Kylix?

Anderson
   - 17 nov 2009

Qual a configuração do servidor windows e do servidor linux (versão do sistema operacional, processador, ram, banco de dados) ?

O servidor linux esta instalado em alguma maquina virtual ?

Durante o processamento o servidor linux não está rodando aplicações concorrentes (backup, atendendo outros usuários, etc.) ? Esta fazendo uso da memória swap ?

Indicadores de processamento costumam diminuir muito a performance em função da atualização de tela. Se for o caso, coloque para ser exibido somente a cada 10% processado ou mais.

Chegou a utilizar o disablecontrols para desconectar da parte visual durante o processamento ?

Ao rodar a aplicação, analisou os processos do linux que estao rodando (comando top)  ?

Paulo Pontes
   - 17 nov 2009

Anderson,

na verdade trata-se de um projeto console e o servidor linux é bem mais parrudo que a máquina windows, por isso continuo achando que o problema é a compilação do Kylix...

Valeu!!!

Paulo Pontes
   - 26 nov 2009

Ainda não encontrei uma solução... mas alguma idéia?