Consulta MySQL - volver a ejecutar - Aumenta uso Memoria

Consulta MySQL - volver a ejecutar - Aumenta uso Memoria

Postby José » Sat Jul 29, 2023 1:49 am

Hola a todos,

De antemano gracias por sus respuestas, y gracias porque estos foros sirven mucho.

La pregunta es que está mal en este código, o que falta (ejemplo preparado para el foro) que el uso de memoria aumenta entre 5 y 10 MB por cada ciclo en que vuelvo a ejecutar la consulta, que trae unos 20.000 registros. Si quito columnas o limito las filas, aunque el consumo es menor, el error persiste.

Code: Select all  Expand view
oDbProdu := Nil

cSelect  := 'Produ.CRAYON1, ' + ;
            'Produ.COD_UNIF, ' + ;
            'Produ.CODIGO, ' + ;
            'Produ.NOMBRE, ' + ;
            'Produ.PRESENT, ' + ;
            'Produ.CONTEN, ' + ;
            'Produ.UNIMEDI, ' + ;
            if( cGlbTabIteCol9 = 'F', 'Produ.REFERPRO, ', 'Prove.FANTASIA, ' ) + ;
            'Produ.CODUNIVER, ' + ;
            'Produ.CODICOMU '

c:= "select" + cSelect + " from TABLAITE as Produ left join PROVEDOR as Prove on Prove.RUT = Produ.RUTPROV"

for n = 1 to 10                       // ciclo para demostrar el hecho
  if valtype(oDbProdu) = 'O'
    release oDbProdu             // probé oDbProdu:end() y tampoco libera
  endif
  oDbProdu:= oMyCon:Rowset(c, oMyCon)
  msginfo( 'espero... y presiono enter')
next


Lo he probado en dos ddbb diferentes, MySQL y MaríaDB de 2 servidores diferentes, y es lo mismo.

Y además, si luego paso la consulta un oBrw (XBrowse) y la navego... los desplazamientos en el oBrw también, aunque menos, aumentan constantemente el consumo de memoria.

Esto es con HB 3.2 + FWH 21.06

Gracias
José Concha Leiva - Chile
"Querer, saber y hacer, es poder"
HB MSVSC + FWH 23.10 + MySQL/MaríaDB/DBFCDX (64 bits)
https://zenitx.com
User avatar
José
 
Posts: 38
Joined: Sat Dec 10, 2016 8:58 pm

Re: Consulta MySQL - volver a ejecutar - Aumenta uso Memoria

Postby carlos vargas » Sat Jul 29, 2023 6:17 am

Ummm, para empezar un query en un ciclo, no se me hace cómodo.
El caso es que para que la consulta finalize, debes hacer un oDbProduct:end() y a continuación un oDbProduct:=nil, para que entre el recolector de basura, pero insisto, ese query en el for...next, no es lo ideal, lo que deberíamos as buscar es hacer un solo query que obtenga todo de una sola vez, esto lo digo en el desconocimiento de que datos y que hacer con ellos.
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
 
Posts: 1683
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: Consulta MySQL - volver a ejecutar - Aumenta uso Memoria

Postby carlos vargas » Sat Jul 29, 2023 6:22 am

Me parece que en el ciclo no le da tiempo al recolector de basura de harbour entrar en acción, en MySQL el hacer constante consultas similares hace que el Sever haga uso se su caché, y es lo buenos de los servidores de bases de datos..., La primera vez toma.su tiempo, las siguientes al ser bastante similares es más rápido...
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
 
Posts: 1683
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua

Re: Consulta MySQL - volver a ejecutar - Aumenta uso Memoria

Postby José » Sat Jul 29, 2023 10:57 pm

Carlos Vargas

Hola, muchas gracias por tu respuesta!

Tienes razón, el ciclo fue solo para la demo, para probar; lo uso un poco más parecido a como tú recomiendas.

Basado en lo que indicaste, usé
Code: Select all  Expand view
oDbProdu:end() ; oDbProdu:=nil
SysRefresh() ; hb_gcAll(.t.)
 

Justo antes de volver a ejecutar la consulta.

Y funciona, efectivamente ya no se eleva el consumo de memoria cuando se carga nuevamente, sea porque cambian los filtros o por otra razón que el usuario requiera.

Tu comentario sobre el "recolector de basura de harbour" me llevó a encontrar hb_gcAll.

Nota. Ahora me queda ver porqué cuando ejecuto ciertas acciones sobre la consulta o registros de esta (onchange u otros), el consumo de RAM también aumenta, aunque de 100 a 300 KB cada vez. Imagino que es mal manejo de mi parte, de variables, procesos u otros que deberé revisar.

De nuevo, muchas gracias!!! y atento si alguien tiene más información.
José Concha Leiva - Chile
"Querer, saber y hacer, es poder"
HB MSVSC + FWH 23.10 + MySQL/MaríaDB/DBFCDX (64 bits)
https://zenitx.com
User avatar
José
 
Posts: 38
Joined: Sat Dec 10, 2016 8:58 pm

Re: Consulta MySQL - volver a ejecutar - Aumenta uso Memoria

Postby artu01 » Sun Jul 30, 2023 12:37 am

Haz intentado con crear indices en el sql, quizas mejore la velocidad.
fwh 17.12, harbour 3.2.0, pelles C, bcc7, Ms-Sql
artu01
 
Posts: 397
Joined: Fri May 11, 2007 8:20 pm
Location: Lima

Re: Consulta MySQL - volver a ejecutar - Aumenta uso Memoria

Postby carlos vargas » Sun Jul 30, 2023 4:11 pm

Me parece que la llamada manual de sysrefresh y el recolector no es necesario, dado que internamente al asignar NIL a la variable contenedora de un objeto query esto hace que se dispare una función de MySQL en C que cierra la consulta y llama al colector de basura, nuevamente me pare que el ejemplo del ciclo no es lo más adecuado ya que no si da tiempo al recolector de ejecutarse, tal vez alguien con conocimiento del tema nos ilustre.
Salu2
Carlos Vargas
Desde Managua, Nicaragua (CA)
User avatar
carlos vargas
 
Posts: 1683
Joined: Tue Oct 11, 2005 5:01 pm
Location: Nicaragua


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 92 guests