Ver Mensaje Individual
  #5  
Antiguo 23-02-2004
Avatar de mlara
[mlara] mlara is offline
Miembro Premium
 
Registrado: jun 2003
Ubicación: Colombia
Posts: 667
Reputación: 22
mlara Va por buen camino
Cita:
No veo sentido a que interbase/firebird siga consumiendo memoria después de terminado el proceso y hasta que se cierre la sesión...
Eso mismo he pensado. Por eso construí el procedimiento que llama 100.000 veces la UDF para saber si ahí estaba el problema. El resultado es que prácticamente no consume memoria. El código dentro del SP de prueba es algo así como:


Código:
DECLARE VARIABLE counter INTEGER;

BEGIN
  counter = 0;
  expr = '(378999.00+(37899.90+75978.00+113600.00+115800.00+0.00)+0.00*0.00+22160.00*0.00+2580.00*23.00+45000.00*1.00)*0.04+378999.00*0.0337';
  WHILE (counter < 100000) DO BEGIN
    calcvalue = evalexpr(expr);
    counter = counter + 1;
  END

  SUSPEND;

END
Como puede verse en el código, la UDF es un evaluador de expresiones matemáticas.

El caso es que después de saber que no es la UDF, no me parece que deba cerrar la sesión para liberar la memoria usada que aparece bajo Uso de PF en las gráficas y también para que suba la memoria física disponible.

En resumen:

En cuanto al uso de la CPU estoy de acuerdo.

En cuanto al uso de memoria, pues el uso exagerado de memoria sólo me parece que podría ser mientras no se haya hecho un commit o un rollback (aunque la verdad, como en una transacción todo va quedando grabado en la base de datos, y sólo se realiza un volcado cuando se hace un commit o un rollback, creo que tampoco debería consumir tanta memoria). Esto quiere decir que no acabo de estar de acuerdo con el uso exagerado de memoria, y no es lógico que deba cerrar la conexión para poder liberar memoria usada por el servidor.

Entre otras cosas, como sugirió Gydba leer otros hilos, los leí y probé la función LiberarMemoria.


Código:
procedure LiberarMemoria;
begin
  if Win32Platform = VER_PLATFORM_WIN32_NT then
    SetProcessWorkingSetSize(GetCurrentProcess, $FFFFFFFF, $FFFFFFFF);
end;
Tampoco sucedió nada. Esto se haría para liberar memoria en el cliente, pero no en el servidor. Después de todo lo evaluado estoy prácticamente seguro de que el problema es del servidor InterBase. Entonces la pregunta concreta sería:

Cómo libero memoria en el servidor InterBase luego de terminada una transacción, mientras aún haya conexiones activas? Cómo hago para liberar esa memoria precisamente desde una conexión, es decir desde un cliente?

Es normal este comportamiento?
__________________
...y mañana caminaré por las calles pasando inadvertido, como siempre.
Responder Con Cita