Array - AADD() vai ficando lento.

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

Array - AADD() vai ficando lento.

Mensagem por clodoaldomonteiro »

Bom, vou ajustar e tirar Array, fazer com DBF mesmo, é ir se desprendendo aos poucos do que atrapalha nos processamentos e usando outras maneiras suportada pela linguagem.

É o fato que, array não é pra isso, e até não tem evolução como tem em outras linguagens.

Obrigado pelo interesse de todos.
At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Array - AADD() vai ficando lento.

Mensagem por JoséQuintas »

O ADO tem uma função que transforma tudo em array de uma vez, mas se não pega todas as informações, só vai atrapalhar.
anp.png
Aproveitei pra fazer a importação mensal das tabelas da ANP que vém em Excel.
Uma delas tem mais de 100.000 registros.
Como é uma vez por mês, demorar alguns minutos acho aceitável.

O que não mencionou é sobre o quanto é esse tempo de demora, se são segundos, minutos, ou horas.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Array - AADD() vai ficando lento.

Mensagem por Itamar M. Lins Jr. »

Olá!
Bom, vou ajustar e tirar Array, fazer com DBF mesmo, é ir se desprendendo aos poucos do que atrapalha nos processamentos e usando outras maneiras suportada pela linguagem.

É o fato que, array não é pra isso, e até não tem evolução como tem em outras linguagens.
E array é para que então ?
Se usando array está lento, imagine DBF.
Agente escreve uma coisa vc escreve outra... Ai fica difícil.
Mostre AQUI o problema. O Ivanil já demonstrou com milhares de registro a criação de array...
Não inventa problema onde não existe.
Até agora não tem como constatar seu problema, e não passa de reclamação inútil. Parece que não quer resolver.
É o fato que, array não é pra isso, e até não tem evolução como tem em outras linguagens.
Explica para nós o que é essa evolução ?

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Array - AADD() vai ficando lento.

Mensagem por JoséQuintas »

Clodoaldo, tente fazer testes isolados.
Por exemplo:

Código: Selecionar todos

AAdd( aDados, {;
   mCodigo,;
   HB_AnsiToOem( rs:Fields( 8 ):Value ),;
   '',;  //Portaria
   '',;  //Descricao
   '';
    })
Crie uma rotina só com isso pra medir tempo, colocando string qualquer e FOR/NEXT.
Depois a mesma com essa conversão.
Vai eliminando possibilidades.

De repente, se for XHarbour lento... aí vai Harbour.

Mas tudo depende de teste, no momento não dá pra dizer o que causa lentidão.
De repente tá pensando que é uma coisa, mas é outra.
O teste acima é relativamente simples de fazer.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Array - AADD() vai ficando lento.

Mensagem por JoséQuintas »

teste.png
Na minha máquininha velha.... menos de 1 segundo.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Array - AADD() vai ficando lento.

Mensagem por JoséQuintas »

Fugindo do tópico um pouco, mas tem a ver com o teste:
Olhem que coisa interessante...
teste.png
Fiz o primeiro teste, tudo certo.
Fui fazer outro teste aumentando a quantidade, o antivírus da Microsoft bloqueou !!!!!

O antivírus deve ter lembrado do tamanho do EXE, e viu que tá diferente.

Não se pode nem fazer teste sossegado..... kkkkk
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Array - AADD() vai ficando lento.

Mensagem por JoséQuintas »

Esqueçam ESSE teste isolado.
Não serve de referência, porque não é a mesma coisa.
Tem que ser outro diferente.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
carlos_dornelas
Usuário Nível 3
Usuário Nível 3
Mensagens: 400
Registrado em: 25 Ago 2004 21:54

Array - AADD() vai ficando lento.

Mensagem por carlos_dornelas »

Clodoaldo, quase nada a ver com o tópico... mas estou precisando fazer exatamente o que você já diz estar fazendo:
Como está só adicionando registros na array, acho que é o limite, pois estou lendo um arquivo .xlsx, com "CreateObject( "ADODB.Connection" )", até aí é muito rápido e depois passando os fields para uma array, para analizar esses dados.
Poderia compartilhar aqui a rotina de utilizas para ler um arquivo .xlsx ? ou enviar no meu email: acd002020@gmail.com

PS: sobre o consumo de memória no xharbour com array, já me aconteceu uma vez o seguinte: dentro de um FOR NEXT eu utilizava o DECLARE para reiniciar/zerar uma matriz. Isso ia consumindo memória a cada ciclo, a ponto de travar a aplicação. Não sei se pode ser o seu caso...

Grato

Antonio Carlos
Curitiba PR
marcosgambeta
Usuário Nível 3
Usuário Nível 3
Mensagens: 332
Registrado em: 16 Jun 2005 22:53

Array - AADD() vai ficando lento.

Mensagem por marcosgambeta »

Itamar M. Lins Jr. escreveu:Olá!

Se fizer o processo sem usar nada, acredito que vai acontecer o problema.
Apenas DO WHILE SKIP ou FOR NEXT... LENDO a PLANILHA VIA ADO vai acontecer a lentidão.
Não tem nada a ver com AADD... Comente a linha //AADD e veja
Verifique isso para confirmar essa suspeita.

Saudações,
Itamar M. Lins Jr.
Clodoaldo,

Penso como o Itamar.

Seu problema poderia estar na leitura do recordset e não no uso de arrays.

As rotinas de array do Harbour são escritas em C e são bem rápidas e eficientes.

Então, mudar o DESTINO (array) não vai ajudar se o problema estiver na ORIGEM (recordset).

Se pesquisar, no Google, por "ado recordset slow", vai se deparar com casos e mais casos envolvendo problemas de desempenho.

Seria possível mostrar como está criando o recordset ?
Atenciosamente,
Marcos Antonio Gambeta
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Array - AADD() vai ficando lento.

Mensagem por alxsts »

Olá!
clodoaldomonteiro escreveu:vi que não tem como ao criar a array, reservar espaço pra ela ou coisa parecida
Com a Função Array(), é possível criar a variável com o número desejado de dimensões e ocorrências por dimensão:

Código: Selecionar todos

Examples

     .  This example creates a one-dimensional array of five elements
        using the ARRAY() function, and then shows the equivalent action by
        assigning a literal array of NIL values:

        aArray := ARRAY(5)
        aArray := { NIL, NIL, NIL, NIL, NIL }

     .  This example shows three different statements which create the
        same multidimensional array:

        aArray := ARRAY(3, 2)
        aArray := { {NIL, NIL}, {NIL, NIL}, {NIL, NIL} }
        aArray := { ARRAY(2), ARRAY(2), ARRAY(2) }

     .  This example creates a nested, multidimensional array:

        aArray := ARRAY(3, {NIL,NIL})

Código: Selecionar todos

Proc Main()

   LOCAL aArray := Array( 1000, 3 )

   CLS

   hb_alert( aArray[1000, 3 ] )   // NIL

RETURN
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

Array - AADD() vai ficando lento.

Mensagem por clodoaldomonteiro »

Bom dia a todos.

Achei o problema, era um AScan() que estava usando numa linha anterior do código.

No Clipper usava array com a FAST.LIB, por conta do tamanho e busca mais rápida, e como no código ainda tem muita coisa da época do clipper, me deparo as vezes com issso. Mas é fato passado já.

Obrigado a todos.
At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
Avatar do usuário
clodoaldomonteiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 821
Registrado em: 30 Dez 2006 13:17
Localização: Teresina-PI
Contato:

Array - AADD() vai ficando lento.

Mensagem por clodoaldomonteiro »

carlos_dornelas escreveu:Clodoaldo, quase nada a ver com o tópico... mas estou precisando fazer exatamente o que você já diz estar fazendo:
Como está só adicionando registros na array, acho que é o limite, pois estou lendo um arquivo .xlsx, com "CreateObject( "ADODB.Connection" )", até aí é muito rápido e depois passando os fields para uma array, para analizar esses dados.
Poderia compartilhar aqui a rotina de utilizas para ler um arquivo .xlsx ? ou enviar no meu email: acd002020@gmail.com

PS: sobre o consumo de memória no xharbour com array, já me aconteceu uma vez o seguinte: dentro de um FOR NEXT eu utilizava o DECLARE para reiniciar/zerar uma matriz. Isso ia consumindo memória a cada ciclo, a ponto de travar a aplicação. Não sei se pode ser o seu caso...

Grato

Antonio Carlos
Curitiba PR
Sim Antonio, segue adiante...

Código: Selecionar todos

////////////////////////////////////////////////////////////////////////////////
//Links úteis
// Link para Excel: http://fivewin.com.br/index.php?/topic/21673-usando-o-createobject-excelapplication/
// Link instalar Access: https://learn.microsoft.com/en-us/answers/questions/296080/how-to-fix-microsoft-ace-oledb-12-0-provider-is-no
// Tem muita coisa aqui no Forum sobre o assunto



Begin sequence
   ...
   ...

   //Planilha a abrir
   mArq_ := 'c:\minha Pasta\Planilha.xlsx'

   TRY   //Cria um objeto de conexão

      oConexao := CreateObject( "ADODB.Connection" )

   CATCH oError
      wvw_messagebox( , 'ERRO...: TER/008'+CRLF+;
       'Aviso..:O MS.Excel não esta Ativado ou Não instalada nesse Computador.'+CRLF+;
       'Instale o MS Excel para continuar com a exportação dos dados.'+CRLF+;
       cl_getError(oError),;
       MB_OK|MB_ICONERROR )
      //lOk:=.f.
      Break
   END

   //Abrindo a PLanilha
      If ".XLSX" $ Upper(mArq_)
         oConexao:ConnectionString := ;
          [Provider=Microsoft.ACE.OLEDB.12.0;Data Source=] + mArq_ +;
          [;Extended Properties="Excel 12.0 Xml; HDR=Yes";] //IMEX=1";]
       Else
         oConexao:ConnectionString := ;
          [Provider=Microsoft.Jet.OLEDB.4.0;Data Source=] + mArq_ +;
          [;Extended Properties="Excel 8.0; HDR=Yes";]
       Endif

   TRY

      oConexao:Open()

   CATCH oError  //Aqui vc pode colocar suas mensagens e rotinas de erros
      msg := 'ERRO...: FUS/009'+CRLF
      msg += 'Aviso..:Não consegui abrir a planilha (XLS) SICONFI na pasta: ' + mArq_ + CRLF
      msg += cl_getError(oError, .t.)
      MsgError( msg, .t.)
      lOk:=.f.
      Break
   END

   //Abrindo a Sheet, fazendo um Select, padrão SQL
   TRY

      rs := oConexao:Execute( "SELECT * FROM ['MinhaPasta$']" ) //vc deve colocar o no da pasta sucedido de um "$"

   CATCH oError
      wvw_messagebox( , 'ERRO...: TER/030'+CRLF+;
       'Aviso..:Não consegui abrir a primeira da planilha de Receitas do STN: ' + mArq_ + CRLF+;
       'Verifique se na planilha selecionada existe a Pasta.'+CRLF+;
       cl_getError(oError),;
       'ATENÇÃO! '+UserName, MB_OK|MB_ICONERROR )
      //lOK:=.f.
      Break
   END

   aDados:={}
   Do While !rs:Eof() .and. poe_gauge()

      IF IN_KEY()=K_ESC 		                            // se quer cancelar
         msg:='Deseja encerrar a operação?'
         IF MsgYesNo( msg )
            BREAK                                         // confirmou...
         ENDIF
      ENDIF

      If !Empty( rs:Fields( 7 ):Value ) //a primeira coluna da planilha começa com "0" na resultado do Select. A coluna "A" vai ser "0", a "B" vai ser "1" ...

         //ajustes que faço na minha rotina
         mCodigo := Left(StrTran( AllTrim( Str( rs:Fields( 7 ):Value ) ), '.', ''), 8)

         mDescricao := StrTran(HB_AnsiToOem( rs:Fields( 10 ):Value ), Chr(10), '')
         mDescricao := AllTrim(StrTran(mDescricao, Chr(13), ''))
         mDescricao := AllTrim(StrTran(mDescricao, CRLF, ''))

         mNorma := StrTran(HB_AnsiToOem( rs:Fields( 11 ):Value ), Chr(10), '')
         mNorma := AllTrim(StrTran(mNorma, Chr(13), ''))
         mNorma := AllTrim(StrTran(mNorma, CRLF, ''))

         //Adicionando resultados na Array
         AAdd( aDados, {;
          mCodigo,;
          HB_AnsiToOem( rs:Fields( 8 ):Value ),;
          HB_AnsiToOem( rs:Fields( 9 ):Value ),;   //Portaria
          mDescricao,;                             //Descricao
          mNorma;
          })

         //Se tiver passando dados pra um DBF:
         If "Condições"
         
            Append Blank
            
            Field->campo1 := rs:Fields( 0 ):Value
            Field->campo2 := rs:Fields( 1 ):Value
            Field->campo3 := rs:Fields( 2 ):Value
            
         Endif

      Endif

      rs:MoveNext()  //Vai pro próximo registro

   Enddo
   rs:Close() //Fecha o Select

   oConexao:Close()  //Fecha Cnexão

End Sequence
//Não fiz o testa da rotina acima, mas qq erro basta poucos ajustes.
//Agumas funções que uso no exemplo, vc pode substituir por outras.
Abraços
At. Clodoaldo Monteiro
Linguagens: Clipper / Harbour
Área de Atuação: Sistemas de gestão para Prefeituras Municipais
Fones: (86)3223-0653, 98859-0236
www.simplesinformatica.com.br
Responder