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}