Página 3 de 4

Apagar um indice TEMPORARY

Enviado: 13 Mar 2017 13:02
por fladimir
Exato João, não pertence a HB_MEMIO.

Rubens, o João descobriu, se mandar DBSETORDER(0) antes de fechar o Temporário é destruido. Testei aki e deu certo...

Agora outra questão relacionada ao assunto:

Código: Selecionar todos

FUNCTION TstTemporary // Rubens Topic 17412 Apagar Indice Temporary
        Use ConRec.DBF  alias ConRec New Share
	Alert( str( OrdCount() ) ) //-----------------> Mostra 12

	nSecIni:=Seconds()
	Index on Recno() TAG TEMP TO TstTemp FOR ConRec->Cancelado== 'S' TEMPORARY  //---------> Não teria q ser pra um outro arquivo de indice Temporario?

	Alert(SecToTime(Seconds()-nSecIni))
	Alert( str( OrdNumber()) ) //----------------> Mostra 13
	Alert( str( OrdCount() ) )   //-----------------> Mostra 13 ou seja acabou ADICIONANDO no indice do ConRec e não em outro
	
	DbSetOrder(0) //------------> Legal apagou o Chave/Tag Temporaria nr 13 pq depois listo e vemos q tem 12, apesar de não ser a intenção deste teste pq não era pra ser a Ordem 13 pq setei jogar em um novo Arquivo de Indice.

	dbcloseall()
	Use ConRec.DBF  alias ConRec New Share
	Alert( str( OrdCount() ) ) //---------------------> Mostrou 12
Agora se refaço o teste acima com SET AUTOPEN OFF
E seto o Indice com dbSetIndex( Nome Indice ) ai cria separado e os resultados são os esperados.

Então concluo que:

SET AUTOPEN ON o Indice Temporario joga como Additive no indice de mesmo nome da tabela MESMO não tendo ADDITIVE no comando
DbSetOrder(0) Destroi o Temporario, não precisando mudar de ordem e depois mandar o OrdDestroy
A Nivel de desempenho o Indice temporário é bem melhor e não precisa do HB_MEMIO para isso

Concordam com os resultados? Alguma observação ou algo a acrescentar ou divergir?

Apagar um indice TEMPORARY

Enviado: 13 Mar 2017 22:31
por rubens
Comecei a ler o último post e fiquei imaginando o SET AUTOPEN como estava, mas você matou a charada e respondeu.
As diferenças me surpreenderam mas os testes foram locais né... daí o ótimo desempenho do setfilter.

Agora você podia ser bonzinho e fazer outro teste já que está com a mão na massa.
Cria uma tabela na memória, appenda estes dados aí nela e faz os testes só para gente ver se a tabela estando na memória vai ter um desempenho melhor ou não...

vlw...

Rubens

Apagar um indice TEMPORARY

Enviado: 14 Mar 2017 01:36
por fladimir
Vamos aos resultados... fiquei preocupado com 1 deles.... vixi...

Preparando ambiente....

Tabela mesma informada nos posts acima com cerca de 1GB e 3 milhões e poucos registros

Apaguei o CDX e recriei o mesmo contendo 12 chaves

Depois com a aplicação compilada com HBMEMIO.HBC e REQUEST HB_MEMIO procedi comos testes...

Código: Selecionar todos

        FERASE('tstTmp.CDX')
        Use ConRec Alias ConRec Shared New
        Alert( str( OrdCound())) //------> 12

//--> Tst 1 Criando Clone Fisico 
        aStru  := ConRec->(DBStruct())
	nSecIni:=Seconds()
	DbCreate(    "tstFisico", aStru, "DBFCDX", .T., "tstFisico")
	APPEND FROM ConRec.DBF 
	Alert('Tempo Clone Fisico ' + SecToTime(Seconds()-nSecIni))  //-----------> 38 segundos (fiz 2 x)
	
	//--> Indexando na Memoria
	nSecIni:=Seconds()
	Index on Recno() TAG TEMP TO TstTemp FOR Field->Cancelado == 'S' TEMPORARY
	Alert('Tempo Indice Memory ' + SecToTime(Seconds()-nSecIni))  //-------------------------> 10 segundos)

	//--> Mostrando qual nr TAG atual e Contando as Tags
	Alert( str( OrdNumber()) ) //---------------------------------> Mostrou 1
	Alert( str( OrdCount() ) ) //---------------------------------> Mostrou 1
	DbSetOrder(0) // Apaga TAG Temp  //---------------------------------> deveria ter apagado igual dos testes anteriores.
	Alert( str( OrdCount() ) ) //--> conta e mostra  //---------------------------------> Mostrou 1... não entendi mais nada...

DbCloseAll()
Ferase('tstFisico.dbf')
	
        //--> Tst 1 Criando Clone Fisico com Append From filtrando
        Use ConRec Alias ConRec Shared New
        aStru  := ConRec->(DBStruct())
	nSecIni:=Seconds()
	DbCreate(    "tstFisico", aStru, "DBFCDX", .T., "tstFisico")
	APPEND FROM ConRec.DBF FOR field->Cancelado == 'S'
	Alert(SecToTime(Seconds()-nSecIni)) //-----------------------------> 45 segundos
	
DbCloseAll()
Ferase('tstFisico.dbf')
        Use ConRec Alias ConRec Shared New
	//--> Tst 2 Criando Memory Memory com Append From filtrando
	nSecIni:=Seconds()
	DbCreate("mem:tstMemory", aStru, "DBFCDX", .T., "tstMemory")
	APPEND FROM ConRec.DBF FOR field->Cancelado == 'S' //  Mesmo sem o FOR o resultado é o mesmo.
	Alert(SecToTime(Seconds()-nSecIni)) // não chega nessa linha apresenta a mensagem abaixo... aparenta ter "estourado"

Unrecoverable error 9009: hb_xrealloc can´t reallocate memory...

... Called from __DbApp(0)

Apagar um indice TEMPORARY

Enviado: 14 Mar 2017 08:33
por rubens
Bom dia...
Você tá precisando de um punhado de sal grosso nessa máquina sua aí ou de repente chamar o Padre Quevedo.

Cara num entendi o porque dos erros não, mas tem coisas que só o harbour faz para você né... e as surpresas de um sistema de informação, na teoria tudo funciona....
A questão do estouro de memória com esse tanto de registros faz sentido...
Eu sugeri o teste para ver se com a tabela na memória ficasse mais rápido o filtro, mas barrou na limitação de memória...
Eu imaginei que poderia trabalhar com ele na memória e se usasse índices temporários na memória ficaria mais rápido do que trabalhar com o arquivo físico, sem contar que eliminaria um monte de testes na operação.

Rubens

Apagar um indice TEMPORARY

Enviado: 14 Mar 2017 09:43
por Kapiaba
Estouro de pilha:

Código: Selecionar todos

   Unrecoverable error 9009: hb_xrealloc can´t reallocate memory...
Esta máquina tem quantos GBS de memória?

Em windows de 64 bits, o recomendável, é no minimo: 8 GBS de memória RAM. Abs.

Apagar um indice TEMPORARY

Enviado: 14 Mar 2017 10:54
por fladimir
Samsumg Intel i7 8GB HD principal SSD 250GB para o SO Windows 7 64

HD (D:) onde a aplicação esta rodando 1 Tera SATA 2

Apagar um indice TEMPORARY

Enviado: 14 Mar 2017 12:04
por Kapiaba
Testei aqui com fivewin, e não me dá estouro de pilha, não gera erros, mas não funciona essa rotina compilada com harbour ou xHarbour. Não entendi o propósito disso. abs.

Apagar um indice TEMPORARY

Enviado: 14 Mar 2017 12:06
por Kapiaba

Código: Selecionar todos

#include "FiveWin.ch"
#Include "Ord.Ch" 

ANNOUNCE RDDSYS
REQUEST OrdKeyNo, OrdKeyCount, OrdCreate, OrdKeyGoto
REQUEST DBFCDX, DBFFPT
ANNOUNCE FPTCDX

function Main()

   local aStru := {}

   LOCAL cAlias

   IF FILE( 'tstTmp.CDX' )

      FERASE('tstTmp.CDX')

   ENDIF

   Use ConRec Alias ConRec Shared New

   go top

   cAlias := ALIAS()

   // browse()

   //Alert( str( OrdCound())) //------> 12 ERRADO
   Alert( str( OrdCount() ))

   //--> Tst 1 Criando Clone Fisico
   //aStru := ( ConRec )->( DBStruct() )
   aStru := ( cAlias )->( DBStruct() )

   nSecIni:=Seconds()

   DbCreate(  "tstFisico", aStru, "DBFCDX", .T., "tstFisico")

   APPEND FROM ConRec.DBF
   Alert('Tempo Clone Fisico ' + SecToTime(Seconds()-nSecIni)) //-----------> 38 segundos (fiz 2 x)
 
   //--> Indexando na Memoria
   nSecIni:=Seconds()
   Index on Recno() TAG TEMP TO TstTemp FOR Field->Cancelado == 'S' TEMPORARY
   Alert('Tempo Indice Memory ' + SecToTime(Seconds()-nSecIni)) //-------------------------> 10 segundos)

   //--> Mostrando qual nr TAG atual e Contando as Tags
   Alert( str( OrdNumber()) ) //---------------------------------> Mostrou 1
   Alert( str( OrdCount() ) ) //---------------------------------> Mostrou 1

   DbSetOrder(0) // Apaga TAG Temp //---------------------------------> deveria ter apagado igual dos testes anteriores.

   Alert( str( OrdCount() ) ) //--> conta e mostra //---------------------------------> Mostrou 1... não entendi mais nada...

   DbCloseAll()

   Ferase('tstFisico.dbf')
 
   //--> Tst 1 Criando Clone Fisico com Append From filtrando
   Use ConRec Alias ConRec Shared New
   aStru := ConRec->(DBStruct())
   nSecIni:=Seconds()

   DbCreate(  "tstFisico", aStru, "DBFCDX", .T., "tstFisico")

   APPEND FROM ConRec.DBF FOR field->Cancelado == 'S'

   Alert(SecToTime(Seconds()-nSecIni)) //-----------------------------> 45 segundos
 
   DbCloseAll()

   Ferase('tstFisico.dbf')
   Use ConRec Alias ConRec Shared New

   //--> Tst 2 Criando Memory Memory com Append From filtrando
   nSecIni:=Seconds()

   DbCreate("mem:tstMemory", aStru, "DBFCDX", .T., "tstMemory")

   APPEND FROM ConRec.DBF FOR field->Cancelado == 'S' // Mesmo sem o FOR o resultado é o mesmo.

   Alert(SecToTime(Seconds()-nSecIni)) // não chega nessa linha apresenta a mensagem abaixo... aparenta ter "estourado"

RETURN NIL

Apagar um indice TEMPORARY

Enviado: 14 Mar 2017 13:51
por fladimir
Obrigado disso João é avaliar o uso dos Indices Temporarios e tb seu desempenho.

Aki estoura, DBF 1 GB 3 milhoes e pouco de registro.

Nos teus testes sua tabela era q tamanho Fisico/Registros?

Apagar um indice TEMPORARY

Enviado: 14 Mar 2017 14:39
por Kapiaba
Tamanho pequeno. Mas, para o Harbour(não tenho certeza) ou xHarbour(o que uso), tamanho não é documento.

use o CLEAR MEMORY para ver o que ocorre.

Vá parando o programa com o ? e se quebrar, mostre onde ele quabra.

Abs.

Apagar um indice TEMPORARY

Enviado: 15 Mar 2017 09:12
por Itamar M. Lins Jr.
Ola!
Aki estoura, DBF 1 GB 3 milhoes e pouco de registro.
Favor postar ele aqui, para testarmos. Caso não seja possível, colocar apenas pedaços que não identifique o cliente, mas com os 3 milhões de registros.
O DBF pode está corrompido, sinalizar viar recno() onde dar o erro, e visualizar via DBU por exemplo.

Saudações,
Itamar M. Lins Jr.

Apagar um indice TEMPORARY

Enviado: 15 Mar 2017 18:10
por fladimir
Posso postar, apenas antes troco o nome dos clientes q estão dentro dando um Replace All e o resto pode ir, mas aki aceita esse tamanho? Pq mesmo compactadi deu 80MB

Enquanto isso vou fazer um teste assim, vou criar arquivos de 200 em 200 MB e testar pra ver se estoura e com q tamanho estoura.

Apagar um indice TEMPORARY

Enviado: 15 Mar 2017 18:17
por asimoes
Aplicações 32 bits podem usar até 4gb de memória.

Apagar um indice TEMPORARY

Enviado: 15 Mar 2017 18:39
por asimoes
Fladimir,

Tem como você postar a estrutura da tabela pra gente gerar 3 milhões de registros e vê no que dá ?

Apagar um indice TEMPORARY

Enviado: 15 Mar 2017 20:06
por fladimir

Código: Selecionar todos

/*
 * Estrutura do arquivo: ConRec.DBF
 */
LOCAL aField[25]
   aField[01] := {"COCLI"     , "C",  8,  0}
   aField[02] := {"NOMECLI"   , "C", 30,  0}
   aField[03] := {"CODPRO"    , "C",  6,  0}
   aField[04] := {"DESCPROD"  , "C", 30,  0}
   aField[05] := {"QTDE"      , "N", 10,  3}
   aField[06] := {"PRECO"     , "N", 12,  2}
   aField[07] := {"DESCONTO"  , "N", 12,  2}
   aField[08] := {"VENDA"     , "C",  6,  0}
   aField[09] := {"DTCOMPRA"  , "D",  8,  0}
   aField[10] := {"PRAZO"     , "N",  5,  0}
   aField[11] := {"VENCIMENTO", "D",  8,  0}
   aField[12] := {"PAGO"      , "C",  1,  0}
   aField[13] := {"VALORPG"   , "N", 12,  2}
   aField[14] := {"DATAPG"    , "D",  8,  0}
   aField[15] := {"COBRAR"    , "C",  1,  0}
   aField[16] := {"CODCOBRAD" , "C",  3,  0}
   aField[17] := {"DTCOBRANC" , "D",  8,  0}
   aField[18] := {"DTAGENDAM" , "D",  8,  0}
   aField[19] := {"COMISSAO"  , "N", 12,  2}
   aField[20] := {"VLRCOMIS"  , "N", 12,  2}
   aField[21] := {"DTFECHAM"  , "D",  8,  0}
   aField[22] := {"HORARECEB" , "C",  5,  0}
   aField[23] := {"TIPODOC"   , "C",  1,  0}
   aField[24] := {"NRDOC"     , "C", 20,  0}
   aField[25] := {"TAXAADM"   , "N", 12,  2}