Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

 
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-09-2005
sostro sostro is offline
Miembro
 
Registrado: ago 2004
Posts: 24
Poder: 0
sostro Va por buen camino
Consume memoria, se porque, pero no se como evitarlo...

Hola a todos. Gracias por vuestro tiempo.
Explico lo que me ocurre.
Tengo la siguiente función:

Código Delphi [-]
{Leer registro TarifaProducto}
 function TMDatosLocal.LeerRegistroTarifaProducto(Id_TarifaProducto:Integer):TTarifaProducto;
 var
   TarifaProducto:TTarifaProducto;
 begin
   {Consulta}
   with MDatosLocal.IBQTarifaProducto do
   begin
     SQL.Clear;
     SQL.Add('Select * from TarifaProducto Where Id_TarifaProducto=:MiId_TarifaProducto ');
     ParamByName('MiId_TarifaProducto').asInteger:=Id_TarifaProducto;
     Open;
     {Recoger los datos}
     with TarifaProducto do
     begin
       Id_TarifaProducto:=FieldByName('Id_TarifaProducto').asInteger;
       Id_Tarifa:=FieldByName('Id_Tarifa').asInteger;
       Id_Producto:=FieldByName('Id_Producto').asInteger;
       CodigoProducto:=FieldByName('CodigoProducto').asString;
       Nombre:=FieldByName('Nombre').asString;
       CosteFabKg:=FieldByName('CosteFabKg').asFloat;
       BeneficioUD:=FieldByName('BeneficioUD').asFloat;
       KiloUnidad:=FieldByName('KiloUnidad').asFloat;
       Medida:=FieldByName('Medida').asString;
       CosteFabricaMillar:=FieldByName('CosteFabricaMillar').asString;
       CosteDestinoMillar:=FieldByName('CosteDestinoMillar').asString;
       Notas:=FieldByName('Notas').asString;
       Eliminado:=FieldByName('Eliminado').asInteger;
       Orden:=FieldByName('Orden').asInteger;
     end; {with interno}
     Close;
   end; {with externo}
   {Registro}
   EscribirRegistro('Lectura de TarifaProducto ' + IntToStr(TarifaProducto.ID_Tarifa)
     + ' ' + IntToStr(TarifaProducto.ID_Tarifa) + ' Correcta');
   {Devolver TarifaProducto}
   LeerRegistroTarifaProducto:=TarifaProducto;
 end;
Una consulta normal y corriente.
El programa requiere en cierto momentos llamar a esta función unas 20.000 o 30.000 veces "consecutivas". Según se llama a esta función el proceso correspondiente al programa en ejecución devora memoria RAM... hasta que el SO dice basta y en forma de protesta anuncia "out of memory". (Ha llegado a ocupar 500 Mb de RAM el proceso...)
Llevo una serie de horas investigando, y variando el parametro BufferChunks del control IBQTarifaProducto de tipo IBQuery de 1000 (valor predefinido) a 2 la cosa mejora ostensiblemente. Pero por lo que he leido ese valor es el número de registro que almacena el control en cache para evitar sobrecarga del sistema para protegerse en caso de consultas que devuelvan muchos registros; además un consecuencia directa de modificar dicho parametro es que la llamada consecutiva a dicha función se reduce de 120 veces por segundo ( con BufferChuks a 1000) a 15 veces por segundo (con BufferChunks a 2); la consulta se enlentece no poco.
Entiendo que el problema con la memoria es debido a que cada vez que llamo a la función no elimino los datos almacenados anteriormente en el buffer del control IBQuery. Pregunta: ¿como lo hago?. En caso de que mi diagnostico no sea cierto, ¿que hago?.

Un saludo a todos y gracias por todo.

NOTA: Esto me ocurre no sólo con esta consulta, sino con cualquiera que tenga un uso equivalente, así que descarto problemas específicos de esta consulta que elegí para poner un caso práctico.

Saludos...

Última edición por dec fecha: 04-09-2005 a las 23:55:56. Razón: (Encerrar el código en la etiqueta DELPHI)
Responder Con Cita
 



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 13:05:22.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi