Spanish Problemas de memoria con los cursores

Espinosa4

Active Member
Licensed User
Longtime User
Hola a todos,

Estoy teniendo problemas con el uso de los cursores.

El tema es que tengo definidas dos variables de tipo cursor dentro de un procedimiento.

El primer cursor1 le asigno datos de una tabla mediante sqlnames.execquery........

Luego, hago un
FOR i =0 to Cursor1.recordcount -1
Cursor2 = sqlciudad.execquery....
Cursor2.position = i
NEXT

No cierro el Cursor2 puesto que entiendo que es una variable local pero me aparece el error, ERROR Cursors opened by this procedure 532. Continue?

Entiendo que es un problema de memoria pero es como si creará tantas variables cursor como registros hay del cursor 1.

Podéis ayudarme por favor?
Tengo que añadir Cursor2.position antes del next?

Gracias
Un saludo a todos
 

Emiliano

Member
Licensed User
Longtime User
Buenas noches Espinosa4,
Realmente estás generando un cursor por cada vuelta, o mas técnicamente hablando, por cada ciclo de FOR. Realmente es una variable local, pero su ciclo de vida no termina hasta que no termina la sub actual (Lo cual ciertamente no ocurre hasta terminar el FOR). ¿Por qué no cierras el cursor2 con un .Close antes del NEXT? De esa manera permites que libere memoria de algo que ya no vas a utilizar.
Si puedes pasar el código completo de ese trecho seria mejor para entender mejor tu problema.

Abrazo.
 

Espinosa4

Active Member
Licensed User
Longtime User
Buenas noches Espinosa4,
Realmente estás generando un cursor por cada vuelta, o mas técnicamente hablando, por cada ciclo de FOR. Realmente es una variable local, pero su ciclo de vida no termina hasta que no termina la sub actual (Lo cual ciertamente no ocurre hasta terminar el FOR). ¿Por qué no cierras el cursor2 con un .Close antes del NEXT? De esa manera permites que libere memoria de algo que ya no vas a utilizar.
Si puedes pasar el código completo de ese trecho seria mejor para entender mejor tu problema.

Abrazo.

Hola Emiliano!
Gracias por responder!

Entendiste perfectamente cual era mi problema. Lo de poner un cursor.close es lo que me suponía (arriba me. Equivoqué al escribirlo ya que lo escribí con un móvil y su texto predictivo o_O).

Lo que no entiendo por qué es así.
Por ejemplo si yo defino una variable
Dim número as Int
For i = 0 to 100
Número = i
Next

Se supone que la variable la defino pero le voy cambiando su valor dentro del FOR pero entiendo que no se crea otra variable con el consiguiente consumo de memoria. Por qué se crean tantos cursores como veces paso por dentro del FOR? La solución es fácil por lo que comentas. Cursor.close. Pero me resulta curioso su funcionamiento.

Un millón de gracias
Un abrazo
 

Emiliano

Member
Licensed User
Longtime User
Hola Emiliano!
Gracias por responder!

Entendiste perfectamente cual era mi problema. Lo de poner un cursor.close es lo que me suponía (arriba me. Equivoqué al escribirlo ya que lo escribí con un móvil y su texto predictivo o_O).

Lo que no entiendo por qué es así.
Por ejemplo si yo defino una variable
Dim número as Int
For i = 0 to 100
Número = i
Next

Se supone que la variable la defino pero le voy cambiando su valor dentro del FOR pero entiendo que no se crea otra variable con el consiguiente consumo de memoria. Por qué se crean tantos cursores como veces paso por dentro del FOR? La solución es fácil por lo que comentas. Cursor.close. Pero me resulta curioso su funcionamiento.

Un millón de gracias
Un abrazo

Para entender mejor como eso funciona, es necesario conocer sobre logica de punteros y como trabaja el garbage collector (proceso interno de la VM que se encarga de liberar memoria destruyendo los objetos que no son mas utilizados, variables fuera de escopo, por ejemplo). Para explicar de una manera simple y aproximada: En cada ciclo FOR, la variable que apunta al cursor se mantiene (cambiando solamente la dirección de memoria a la cual apunta), pero es creado un nuevo objeto cursor en una posición de memoria distinta. Probablemente, luego de cada ciclo esa variable de cursor sale de escopo y ya es candidata a ser destruida por el garbage collector de la VM, pero por la velocidad de ejecución no da tiempo de este actuar y los cursores se acumulan, hasta que llegan a un cierto limite que explota con un error. Espero haber sido claro, no es un asunto facil de explicar con pocas palabras. De hecho, trabajar con punteros es tan complejo y anti-intuitivo a veces que fue el principal motivo de lenguajes modernos como Java y C# abandonar su uso (continuan usando internamente, pero para el programador es transparente).
 

Espinosa4

Active Member
Licensed User
Longtime User
Perfecto Emiliano! Ya me ha quedado claro el tema!
Infinitas gracias por tu ayuda. Ahora tendré siempre la precaución de cerrar el cursor para evitar problemas de memoria.

Un saludo
Espinosa
 
Top