hb_xrealloc

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

Moderador: Moderadores

sambomb
Usuário Nível 3
Usuário Nível 3
Mensagens: 250
Registrado em: 24 Out 2008 17:02
Localização: Itaocara - RJ - Brasil

hb_xrealloc

Mensagem por sambomb »

---------------------------
Erro irrecuper vel 9009:
---------------------------
hb_xrealloc nao pode realocar mem¢ria
---------------------------
OK
---------------------------
Alguem sabe o que pode causar esse erro?
Imagem

Rca Sistemas - Itaocara - RJ
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: hb_xrealloc

Mensagem por sygecom »

Já vi esse erro antes, mas nunca soube como e por que acontece isso...
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
sambomb
Usuário Nível 3
Usuário Nível 3
Mensagens: 250
Registrado em: 24 Out 2008 17:02
Localização: Itaocara - RJ - Brasil

Re: hb_xrealloc

Mensagem por sambomb »

Já me disseram que pode ser problema de hardware, para resolver é simples é só utilizar sysrefresh() ou atualizar um aspecto visual de um dialogo(como o titulo da janela) em ambos os casos vai reconfigurar o manejamento da memória
Imagem

Rca Sistemas - Itaocara - RJ
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Re: hb_xrealloc

Mensagem por sygecom »

O Problema é saber quando vai dar o erro para poder dar esse sysrefresh().
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

hb_xrealloc

Mensagem por fladimir »

Descobri como ocorre mas não sei commo resolver

Executem o código abaixo e veja se ocorre o erro Unrecoverable error 9009: hb_xrealloc can't reallocate memory

Aki ocorre e pelo q pesquisei teria q fazer um Garbage collector algo assim pq é erro de alocação de memória, mas... no Harbour 3.4 não tem essa função

Criei baseado no código fonte do xharbour uma usando funções em C mas tb não resolveu o problema.

Alguém sabe como resolver? Tenho um sistema legado q gostaria de resolver essa questão q ocorre eventualmente em determinadas rotinas.

Código: Selecionar todos

	LOCAL cString := "", i, adados := {}
	FOR i := 1 TO 1000000  
		cString += "mais dados aqui"  

		aadd(adados, { i, {i, cString} } )

 		/*
                 IF i % 1000 == 0  
			hb_gcAll(.T.)
		ENDIF
                */
	NEXT
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
ivanil
Usuário Nível 3
Usuário Nível 3
Mensagens: 166
Registrado em: 11 Set 2004 15:13
Localização: Florianópolis/SC

hb_xrealloc

Mensagem por ivanil »

Ola,

De uma revisada em seu código;
esta dentro de for que vai ate 1.000.000, alimentando uma matriz com o incremento da variável cString a cada salto, haja memoria para lidar com isso;
Somente o ultimo elemento da matriz, caso chegasse nele já seria uma string de 15x1.000.000;


;

at
Anexos
2025-10-17_112053.png
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

hb_xrealloc

Mensagem por fladimir »

Grato pelo retorno, ali foi pra demonstrar o problema pode reduzir o nr de interações, o fato é q minha aplicação não tem rotinas dessa magnitude e o erro ocorre, o q precisao saber é como fazer com funcione o garbage collector ou outra alternativa para resolver esse erro.
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

hb_xrealloc

Mensagem por fladimir »

Fiz um teste aki e não passa de 50700 iterações, minha maquina tem 48GB de memoria, menos q isso blz passa, mudei string para apenas "." para consumir menos espaço.
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:

“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”
.


Até 2017    Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL


Novos Projetos:

   Desktop Visual           Windev Desktop
   Celular Android/iOS   Windev Mobile
   WEB                            Windev Web


Sejamos gratos a Deus.
ivanil
Usuário Nível 3
Usuário Nível 3
Mensagens: 166
Registrado em: 11 Set 2004 15:13
Localização: Florianópolis/SC

hb_xrealloc

Mensagem por ivanil »

seu problema esta em cString +=; ela se se expande ate 1000000 x o tamanho, a memória estoura muito antes disso...
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

hb_xrealloc

Mensagem por JoséQuintas »

Como já foi dito, NO CASO DESSE TESTE, o erro foi por estouro de memória.

A questão que fica é se o erro mencionado no início do post também se refere a estouro de memória.

Estouro de memória é usar memória demais.
Não se trata de mudar pra 64 bits, ou de colocar mais memória.
A primeira coisa a verificar é se a rotina não está gastando memória demais.

É tentar avaliar em que momento ocorre o erro.
Num caso de grandes volumes de informação, passar por referência pode economizar muita memória.
Passar 1GB por referência economiza 1GB de memória.

Também o uso de opções do linqueditor e/ou linqueditores mais novos.
O default do mingw atual é 4GB pra aplicativos 32 bits.
Isso ajuda.

Mas pode ter abuso sem perceber

Código: Selecionar todos

a := Processa( b )
Sei lá a parte interna, mas num caso desses, 500MB pode estourar.
Tem a variável B ocupando 500MB, tem o uso na rotina mais 500MB, conforme a rotina mais cópias dos 500MB, talvez o retorno mais 500MB, etc.
Ou em browse, variável original, variável do browse, variáveis da lib, etc.
Acaba sendo relativamente fácil desperdiçar memória sem perceber, e até estourar o limite.
A gente pensa no limite de uma variável, mas esquece que o conteúdo se multiplica.
É tentar avaliar a rotina aonde isso acontece.

Tanto faz se é harbour ou xharbour, se mingw ou blinker, se windows ou linux, limites existem, e passar variáveis por rotinas multiplicam o conteúdo.
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/
Responder