hb_xrealloc
Moderador: Moderadores
-
sambomb
- Usuário Nível 3

- Mensagens: 250
- Registrado em: 24 Out 2008 17:02
- Localização: Itaocara - RJ - Brasil
hb_xrealloc
---------------------------
Erro irrecuper vel 9009:
---------------------------
hb_xrealloc nao pode realocar mem¢ria
---------------------------
OK
---------------------------
Alguem sabe o que pode causar esse erro?
Erro irrecuper vel 9009:
---------------------------
hb_xrealloc nao pode realocar mem¢ria
---------------------------
OK
---------------------------
Alguem sabe o que pode causar esse erro?

Rca Sistemas - Itaocara - RJ
- sygecom
- Administrador

- Mensagens: 7131
- Registrado em: 21 Jul 2006 10:12
- Localização: Alvorada-RS
- Contato:
Re: hb_xrealloc
Já vi esse erro antes, mas nunca soube como e por que acontece isso...
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
xHarbour.org + Hwgui + PostgreSql
-
sambomb
- Usuário Nível 3

- Mensagens: 250
- Registrado em: 24 Out 2008 17:02
- Localização: Itaocara - RJ - Brasil
Re: hb_xrealloc
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

Rca Sistemas - Itaocara - RJ
- sygecom
- Administrador

- Mensagens: 7131
- Registrado em: 21 Jul 2006 10:12
- Localização: Alvorada-RS
- Contato:
Re: hb_xrealloc
O Problema é saber quando vai dar o erro para poder dar esse sysrefresh().
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
xHarbour.org + Hwgui + PostgreSql
hb_xrealloc
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.
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.
“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

- Mensagens: 166
- Registrado em: 11 Set 2004 15:13
- Localização: Florianópolis/SC
hb_xrealloc
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
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
hb_xrealloc
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.
“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.
hb_xrealloc
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.
“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

- Mensagens: 166
- Registrado em: 11 Set 2004 15:13
- Localização: Florianópolis/SC
hb_xrealloc
seu problema esta em cString +=; ela se se expande ate 1000000 x o tamanho, a memória estoura muito antes disso...
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
hb_xrealloc
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
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.
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 )
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/
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/
