FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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: 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) |
#2
|
||||
|
||||
Cita:
|
#3
|
|||
|
|||
Hola Casimiro. Gracias por tu interés.
Es la devolución de lo buscado en la BD. Es una estructura que devuelvo por ser una función lo que he transquito. Un saludo. |
#4
|
||||
|
||||
Cita:
Bueno siempre se aprende algo nuevo. Se puede devolver el valor de una función tanto con result como con el nombre de la función. Cita:
* Podrias usar Prepare y UnPrepare del Query. * Supongo que estas llamando tantas veces a esta función porque quieres que te obtener los resultados para varios Id_TarifaProducto, porque no haces la consulta para que te devuelta todos los resultados en una sola tabla en vez de un solo resultado por vez.
__________________
[Crandel] |
#5
|
|||
|
|||
Hola Ángel. Gracias por implicarte.
Pues no puedo hacer una única consulta, pues la demanda de lectura de los registros de esa tabla es impredicible. No es previsible cual será el siguiente registro solicitado a leer. Se requiere la lectura de ese registro, y se ejecuta. Aunque pudiera hacer una consulta de multiples registros, sólo sería enmascarar el problema, y lo que realmente quiero es terminar de dominar el problema. Es un programa de uso intensivo y relativamente grande. Ya había probado el comando Prepare y no funcionó siquiera la lectura. Un saludo Ángel. |
#6
|
|||
|
|||
Ah, y un dato relevante. No depende del tamaño de lo que se quiera buscar. La basura que me deja en memoria es más o menos del mismo tamaño sin importarle el nº de registros filtrados por la consulta SQL.
Otro dato: Delphi 7 + IBX + Interbase 6.5 Un saludooo |
#7
|
||||
|
||||
Hola,
¿has probado con la propiedad Unidirectional = True de la Query?
__________________
Progress Openedge https://abevoelker.com/progress_open...dered_harmful/ Delphi forever... |
#8
|
||||
|
||||
Cita:
Así que si no tienes todo el código para comprobar... es mejor preguntar, por si acaso. Te puedes encontrar con muchas sorpresas. |
#9
|
|||
|
|||
Premio para Defcon1... todos mis problemas han desaparecidos... es la fórmula magistral.
Un saludo a todos, gracias por vuestro tiempo y en especial a Defcon1 (entendereis esta deferencia con él ;-) ) |
#10
|
|||
|
|||
Me perdi en la solucion
Hola a todos y disculpen pero ya no entendí. Tengo el mismo problema con el out of memory con un IBQuery y no supe como se arregló, si alguien me puede explicar como se solucionó el problema se lo agradezco mucho.
__________________
Saludos Cordiales |
#11
|
||||
|
||||
Según defcon1, dice que es poniendo la propiedad Unidirectional del IbQuery a True.
Pero que conste que lo dice él , yo simplemente transcribo... que de esto no entiendo y me sorprende la solución . Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. |
#12
|
|||
|
|||
Gracias
muchas gracias Lepe
No contesté antes porque solo tengo internet en mi trabajo y acabo de llegar de un laaargo fin de semana. probare lo que dice Defcon1.
__________________
Saludos Cordiales |
|
|
|