Página 2 de 3
Ordenar (SORT) uma Hash Table
Enviado: 23 Out 2018 22:38
por asimoes
Kkk, tô ficando velho, muito velho pra isso,
A novidade é atribuir nil para hrecord
No meu posto não tem
Ordenar (SORT) uma Hash Table
Enviado: 24 Out 2018 14:13
por fladimir
Testei com uma base de 1.118.902 registros tendo cada registro 69 colunas/campos
Baseando no codigo do Quintas, testei com While e DBEVAL... ai depois de um tempo rodando cai fora da rotina... ai abrindo o hb_out.log da impressão q houve uma falha de memoria, mas não poderia não é?
Segue hb_out.log do DBEVAL
Código: Selecionar todos
Terminated at: 2018-10-24 13:03:52
Unrecoverable error 9009: hb_xrealloc can't reallocate memory
Called from HB_HSET(0)
Called from (b)IMG9(13) in _Testes.prg
Called from DBEVAL(0)
Called from IMG9(17) in _Testes.prg
Called from MAIN(238) in menu.prg
------------------------------------------------------------------------
Segue hb_out.log do WHILE
Código: Selecionar todos
Terminated at: 2018-10-24 13:08:23
Unrecoverable error 9009: hb_xrealloc can't reallocate memory
Called from HB_HSET(0)
Called from IMG9(14) in _Testes.prg
Called from MAIN(238) in menu.prg
------------------------------------------------------------------------
Alguém teria alguma sugestão do q poderia ser?
Ordenar (SORT) uma Hash Table
Enviado: 24 Out 2018 14:22
por JoséQuintas
o que tem nessas linhas? 13, 14, 17 de img9 ?
Ordenar (SORT) uma Hash Table
Enviado: 24 Out 2018 14:26
por JoséQuintas
E qual o tamanho do registro?
Se cada campo tiver 1 byte, que não é, já dá uns 70MB
Se tiver campo memo então... vixe... 32 bits limita a 4GB.
Ordenar (SORT) uma Hash Table
Enviado: 24 Out 2018 14:28
por JoséQuintas
1 milhão de registros. 1MB.
Cada registro com 4000 bytes.. 4GB.... impossível em 32 bits.
Se fiz a conta direito... rs
Ordenar (SORT) uma Hash Table
Enviado: 24 Out 2018 14:32
por JoséQuintas
Conta simples:
Quanto é o tamanho do DBF + FPT, se é que isso é dbf...
Ou o tamanho no MySQL, se for MySql...
Ordenar (SORT) uma Hash Table
Enviado: 24 Out 2018 14:33
por fladimir
Tamanho da tabela 925 MB
Ordenar (SORT) uma Hash Table
Enviado: 24 Out 2018 14:57
por JoséQuintas
Não bate com a linha do erro.
No dbeval mostra o erro na linha 17, que chama a 13.
A 17 é dbskip()
Dependendo da rotina, se passa a variável por parâmetro, vai ser quase 1GB pra cada chamada, lembre-se disso.
a := 1GB
Funcao( a )
Isso são 2GB.
Ordenar (SORT) uma Hash Table
Enviado: 24 Out 2018 15:03
por JoséQuintas
O inverso também
a := ConverteHash()
Vai precisar gravar 1GB em a, antes de destruir o 1GB da subrotina.
Ordenar (SORT) uma Hash Table
Enviado: 24 Out 2018 15:13
por fladimir
o erro é no hb_hSet
depois de cerca de 275mil registros ocorre o erro.
Eu fiz um teste no FOR ... FCount() q varre as colunas do registro, mudei pra fazer até a coluna 10, passou, ou seja, esta estourando mesmo.
Vou ver até q coluna preciso e deixar assim, mas isso é ruim pq uma hora vai dar problema conforme crescer mais a tabela.
Ordenar (SORT) uma Hash Table
Enviado: 24 Out 2018 15:34
por JoséQuintas
Use arquivos temporários.
Nunca vai ter problema de memória.
É assim que o Windows funciona.
Tem essa também.... vai depender de que programas o cliente carrega ao mesmo tempo, pra saber o limite. Pode funcionar aí e no cliente não.
Ordenar (SORT) uma Hash Table
Enviado: 24 Out 2018 16:09
por fladimir
Quintas, se não for pedir muito, da uma ideia do exemplo do teu código (imagem) como ficaria com arquivo temporário.
Ordenar (SORT) uma Hash Table
Enviado: 24 Out 2018 16:56
por JoséQuintas
Mais ou menos isto:
Código: Selecionar todos
cTmpFile := MyTempFile()
SELECT 0
dbCreate( cTmpFile, arquivo->( dbStruct() ) )
USE (cTmpFile) ALIAS temp
DO WHILE ! arquivo->( Eof() )
RecAppend()
FOR nCont = 1 TO FCount()
FieldPut( nCont, arquivo->( FieldGet( nCont ) ) )
NEXT
arquivo->( dbSkip() )
ENDDO
Ordenar (SORT) uma Hash Table
Enviado: 24 Out 2018 17:22
por JoséQuintas
Talvez seja bom um Inkey() aí no meio, ou equivalente em tela gráfica.
É para não roubar todo tempo do Windows, e no caso de GUI pra não congelar a tela até o término.
Ordenar (SORT) uma Hash Table
Enviado: 24 Out 2018 20:35
por fladimir
Deu certo mas fica muito lento.
Resolvi da seguinte forma, crio um indice temporario reduzindo o range de registros, exemplo periodo tal... ai em cima disso crio uma hashtable
Ai fica rapido e resolve
Agora criar a hash ou arquivo temporario a partir da tabela original sem filtro nenhum antes no cenario q apresentei aki demora demais.