Skip to main content
Announcements
Have questions about Qlik Connect? Join us live on April 10th, at 11 AM ET: SIGN UP NOW
cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

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;

11 Replies
Not applicable
Author

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);



Not applicable
Author

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.

Not applicable
Author

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

Not applicable
Author

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

Not applicable
Author

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

Not applicable
Author

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.

Not applicable
Author

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.

Not applicable
Author

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.

Not applicable
Author

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