11 Replies Latest reply: Jul 23, 2015 2:52 PM by Clever Anjos RSS

    Load a partir de variáveis

      Olá pessoal,

      Tenho uma dúvida quanto ao carregamento (Load) de dados a partir de variáveis e seu desempenho.

      No meu caso não encontrei outra alternativa para carregar os dados de um TXT devido a complexidade do tratamento dos campos e tive que jogá-los em variáveis para depois carregá-los em tabelas:

      Realizei dois testes e obtive desempenhos muito ruins, gostaria de algumas sugestões quanto à prática e ao desempenho.

      Usando LoadAutoGenerate foram 6min. e LoadInline foram 11min.:

      set Var1 = 0;
      set Var2 = 0;
      set MaxRec = 100000;

      sub LoadAutoGenerate
      Tbl_Teste:
      load $(Var1) as Variavel1, $(Var2) as Variavel2 autogenerate 1;
      end sub;

      sub LoadInLine
      Tbl_Teste:
      load * inline [
      variavel1,variavel2
      $(Var1),$(Var2)];
      end sub;

      for idx=1 to MaxRec
      Var1 = idx;
      Var2 = MaxRec-idx;
      call LoadAutoGenerate;
      rem call LoadInLine;
      next idx;

        • Load a partir de variáveis
          fsimoes

          Realmente esse tipo de looping não são nada performaticos, no entanto no seu caso, não há a necessidade de usar o for, faça simplesmente:

           

          Tbl_Teste:

          load $(Var1) as Variavel1, $(Var2) as Variavel2 autogenerate $(MaxRec);



            • Load a partir de variáveis

              Não sei se consegui me expressar corretamente ou então, não consegui compreender sua sugestão. Vejo que o FOR é necessário pois cada iteração o conteúdo das variáveis é alterado com dados provenientes do arquivo TXT. Se eu usar cfe. a sugestão acarretará o LOAD de 100.000 valores iguais na variavel 1 e na 2.

              No exemplo hipotético e de testes que informei estou jogando o próprio IDX para dentro das variaveis (Var1 e Var2) a fim de preencher com algum dado, poderia ter usado um rand() ou algo do gênero.

                • Load a partir de variáveis
                  fsimoes

                  Verdade eu não havia prestado atenção direito.

                  Com o exemplo que citei antes, para simular exatamente o que seu looping esta fazendo vc pode fazer o seguinte:

                   

                  set Var1 = 0;

                  set Var2 = 0;

                  set MaxRec = 10;

                   

                  Tbl_Teste:

                  load

                  $(Var1)+RecNo() as Variavel1,

                  $(MaxRec)-RecNo() as Variavel2

                  autogenerate $(MaxRec);



                   

                  No entanto, dependendo do nível de interação que vc deseja ter com essas variáveis, ai não tem jeito, terá mesmo que usar um for, e ele realmente não é dos mais rápidos.

                   

                  Eu tenho uma situação onde tenho que utiliza-lo por falta de tempo para reanalizar e tentar outra forma de fazer, e realmente aumenta consideravelmente o tempo de carga.

                   

                  Abraço

                  • Load a partir de variáveis
                    fsimoes

                    Outra coisa, se puder mandar um exemplo desse TXT talvez possamos encontrar uma solução sem looping.

                      • Load a partir de variáveis

                        O arquivo que estou processando possui situações como a seguinte:

                        03110|||36524,42|xxx|5,020|1833,53|6|1|0,350|127,830|2|0,350|127,830|3|1,050|383,500|4|0,250|91,310|5|3,020|1103,060|6|0,000|0,000|0,03|5

                        Neste tipo de registro 03110 o primeiro indicador 6 informa que terei seis triplas contendo ID,Aliquota,Valor e após, ainda contêm mais campos. Sendo que ora poderá vir com 6 triplas ou 5, 3, 1 ou nenhuma. Ou seja, o tamanho do registro é variável. Para complicar não tenho apenas registros com o tipo 03110 e vários outros tipos com diferentes tamanhos de registro e campos.

                        Tentei ler o TXT várias vezes excluindo todos os registros e mantendo apenas um tipo de registro para cada tabela temporária e depois unir com os comandos de JOIN, porém, me deparei com situações onde necessito de dados de outros registros que não possuem chave mas que estão unidos conceitualmente no arquivo pela sequencia do arquivo TXT, ou seja, 03000 é pai de váriso registros 03100 que são pais de seus respectivos registros 03110. Desta forma não posso ler separadamente os registros. Joguei para variável em um LOOP e está processando rapidamente, porém ao dar LOAD ... AUTOGENERATE 1; a performance é horrível.

                        03000|CNPJ

                        03100|TIPO DE EMPRESA|ARRECADACOES

                        03110|.... detalhamento cfe. acima

                         

                          • Load a partir de variáveis
                            fsimoes

                            Marcio, certa vez tive que fazer um script para carregar informações do log do Squid, foi bem chato fazer porque tinha muitos coisinha no meio e a estrutura do arquivo é mais ou menos complicada como essa que vc descreveu, mas não tanta.

                            Mas foi usando usei basicamente as funções Index, Left e Subfield.

                            No entanto no fim das contas como o arquivo era muito grande, cerca de 100 mb cada, o tempo de carga era bem logo também.

                            Mesmo assim acredito que será mais rápido que o for.

                            • Load a partir de variáveis

                              Estou surpreso Negativamente com a performance do LOOP e tambem com a junção dos métodos CALL e SUB no script do QlikView. Retirei o LOOP e deixei apenas uma Procedure Recursiva usando CALL e SUB e a performance foi ainda pior que o LOOP. Fiquei desapontado com o resultado quando retirei o Load Autogenerate e mesmo sem fazer "nada" o processamento do script "ficou 10 minutos comendo mosca na iteração".

                              sub RecursiveLoad
                              Var1 = idx;
                              Var2 = MaxRec-idx;
                              rem call LoadAutoGenerate
                              rem call LoadInLine;
                              Tbl_Teste:
                              load $(Var1) as Variavel1, $(Var2) as Variavel2 autogenerate 1;
                              if idx < MaxRec then
                              idx = idx + 1;
                              call RecursiveLoad
                              end if
                              end sub;

                              set idx = 0;
                              call RecursiveLoad;


                              Mas espero que a versão QlikView 11 supere as expectativas e dê uma melhorada nesta questão de scripts e performance de LOOP e CALL+SUB. Pois mesmo encontrando uma alternativa para evitar estas funções, creio que um dia alguém precisará usar... rsrsrs.

                                • Load a partir de variáveis

                                  Fábio, estou usando Index, Left e Subfield e outras funções de tratamento de caracter, porém, preciso de uma estrutura de repetição ou procedures para manter o laço de repetição e ler os registros pai e filhos. O meu FOR não é para ler os dados da Linha e sim a sequencia de Registros.

                                    • Load a partir de variáveis

                                      Alguém possui mais alguma dica para resolver este caso ou melhorar a performance?

                                        • Load a partir de variáveis
                                          fabio cabral

                                          ola mauricio,

                                          eu tambem nao tive um bom desempenho com as estruturas de repeticao durante a carga, mas a forma que consegui melhorar um pouco o desempenho foi diminuindo a quantidade de dados no loop... no meu caso eu criei a tabela apenas com um indice e os campos para o calculo, e depois do loop, fiz um join para adicionar os outros campos. melhorou, mas ainda assim achei lento.
                                          talvez nao se aplique ao seu caso, mas assim percebi que melhou o tempo de carga.

                                           

                            • Re: Load a partir de variáveis
                              Clever Anjos

                              Marcio alguma dessas sugestões atendeu?

                              Se sim, por favor feche o tópico