Hola a todos. Gracias por vuestro tiempo.
Explico lo que me ocurre.
Tengo la siguiente función:
Código Delphi
[-]
function TMDatosLocal.LeerRegistroTarifaProducto(Id_TarifaProducto:Integer):TTarifaProducto;
var
TarifaProducto:TTarifaProducto;
begin
with MDatosLocal.IBQTarifaProducto do
begin
SQL.Clear;
SQL.Add('Select * from TarifaProducto Where Id_TarifaProducto=:MiId_TarifaProducto ');
ParamByName('MiId_TarifaProducto').asInteger:=Id_TarifaProducto;
Open;
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;
Close;
end;
EscribirRegistro('Lectura de TarifaProducto ' + IntToStr(TarifaProducto.ID_Tarifa)
+ ' ' + IntToStr(TarifaProducto.ID_Tarifa) + ' Correcta');
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...