Alaska Software Inc. - lentitud de acceso a bases de datos
Username: Password:
AuthorTopic: lentitud de acceso a bases de datos
Ernesto Avedillolentitud de acceso a bases de datos
on Fri, 24 Mar 2006 10:16:19 +0100
Hola todos, he leido el problema que tiene merche en relacion a la lentitud 
de acceso a las bases de datos y creo que me podreis dar alguna ayuda.

La rutina de la que voy a hablar es la siguiente:

   (AreaConc)->( DbSetFilter( 
{||(AreaConc)->NumMezcla==(AreaPadre)->NumMezcla },;
                            '('+Str(AreaConc)+')->NumMezcla==('+Str(AreaPadre)+')->NumMezcla' 
 ) )
   (AreaConc)->( DBGoTop() )
   Do While !(AreaConc)->( EOF() )
      AADD(aCompOld, {(AreaConc)->Num_Comp , 
(AreaConc)->P_Peso,(AreaConc)->Lab,(AreaConc)->Fase2})
      (AreaConc)->( DBSkip() )
   EndDo

Esta rutina me ha dado muchos problemas por su lentitud de ejecucion. He 
realizado un estudio de tiempos y me he dado cuenta de que la sentencia 
DBSKIP() llegaba a tardar hasta 8 segundos en ejecutarse. (Y solo para un 
registro)

Cuando borro todos los indices la rutina funciona volando, sin embargo, a 
medida que pasa el tiempo el problema va degenerando tanto que me ha llegado 
a colgar el servidor por su lentitud.

Me imagino que este es el mismo problema que tiene merche?

No se lo que es el Garbage colector. Sinceramente no lo he utilizado nunca y 
si lo he hecho no me he enterado. Alguien me puede explicar lo que es?

Actualmente trabajo con la version 1.9 de XBASE  y las bases de datos son 
DBF grandes e hasta 2000 registros.

Gracias
Ernesto
Pablo BotellaRe: lentitud de acceso a bases de datos
on Fri, 24 Mar 2006 12:40:57 +0100
Hola,

Bueno vamos por pasos

> No se lo que es el Garbage colector. Sinceramente no lo he utilizado nunca
> y si lo he hecho no me he enterado. Alguien me puede explicar lo que es?
El colector de basura es un mecanismo interno del runtime de Xbase++ (
Clipper tambien tiene su GC)
para asignar memoria a las variables y liberarla cuando no hace falta. Tu no
haces nada explcito  para utilizarlo ( en clipper se poda activar
explicitamente con Memory(-1) ) , pero hay ciertas operaciones que usan el
CG ms que otras.

Concretamente aadd() es una de las que mas le "duelen" al CG.

> Actualmente trabajo con la version 1.9 de XBASE  y las bases de datos son
> DBF grandes e hasta 2000 registros.

Con la 1.9 se mejora mucho el CG y aunque operaciones como aadd() le siguen 
doliendo, se nota mucho menos.
De todas formas intentar sacar un poquito de tiempo este fin de semana para 
publicar un pequeo ejemplo usando listas enlazadas con ot4xb.dll
que incluso con 1.9 la diferencia de velocidad no solo se sigue notando sino 
que  adems el impacto sobre el sistema en infinitamente menor que usando 
aadd()

( si me pasas la definicion de los campos Num_Comp,P_Peso,Lab,Fase2 monto el 
ejemplo con los mismos tipos y asi casi te valdria tal cual)

Ahora vamos con lo del filtro

Si tienes algn indice en AreaConc que empiece por NumMezcla ( o Str( 
NumMezcla , n , nn ) si es numrico )
deberas reemplazar el filtro por un scope y si no tienes deberas 
planteartelo, dependiendo de la frecuencia con que necesites hacer esta 
operacin.

En tu caso lo tienes muy fcil porque el filtro es simple

(AreaConc)->( DbSetScope( SCOPE_BOTH , (AreaPadre)->NumMezcla ) )
o
(AreaConc)->( DbSetScope( SCOPE_BOTH , Str((AreaPadre)->NumMezcla ,n,nn) ) )
si es numerico

Cuando son filtros ms complicados lo que se debe hacer es tratar de 
reemplazar parte del filtro por un scope lo mas restrictivo posible
y as se evaluan cuantos menos registros mejor.

Saludos,
Pablo Botella
-------------------------------------------------------
Get The Open Tools for Xbase++
here: http://www.xbwin.com
-------------------------------------------------------
Ernesto AvedilloRe: lentitud de acceso a bases de datos
on Fri, 24 Mar 2006 15:54:23 +0100
Hola Pablo,

La base de datos AreaConc tiene los siguietes Campos;

NumMezcla,"C" , 13, 0
Num_Comp, "C" , 13, 0
P_Peso  , "N" , 7 , 3
Lab     , "L" , 1 , 0
Fase2   , "L" , 1 , 0

Y esta indexada por NumMezcla + Num_Comp

En relacion al setScope recuerdo que inicialmente tenia programada la rutina 
de esta manera, pero en determinadas ocasiones (No hablo exclusivamente de 
esta base de datos sino en otras tantas) no me realizaba correctamente la 
operacin y finalmente decidi utilizar el DBSetFilter.
En relacion a este punto, he de decir que he llegado a sustituir la funcion 
DBSetScope por SET SCOPE TO porque la primera me ha dado ciertos problemas 
que me solventaba la segunda. (seguro que la culpa es mia pero no he sabido 
manejarla correctamente).

Lo que realmente me sorprende es que cuando borro los indices y los vuelvo a 
crear nuevos, el programa no tarda nada en realizar la operacin, pero si 
espero unas horas en las que haya trabajado con la base de datos, empiezo a 
tener problemas de velocidad. Ademas, me he encontrado que la lentitud me la 
causa el DBSKIP; hasta 8 segundos me ha llegado a tardar una sola sentencia 
en ejecutarse (slo un registro).

Gracias
Ernesto

"Pablo Botella" <pbn_NOSPAM_@pablob.com> escribi en el mensaje 
news:787ef152$2b418107$22170c@news.alaska-software.com...
> Hola,
>
> Bueno vamos por pasos
>
>> No se lo que es el Garbage colector. Sinceramente no lo he utilizado 
>> nunca
>> y si lo he hecho no me he enterado. Alguien me puede explicar lo que es?
> El colector de basura es un mecanismo interno del runtime de Xbase++ (
> Clipper tambien tiene su GC)
> para asignar memoria a las variables y liberarla cuando no hace falta. Tu 
> no
> haces nada explcito  para utilizarlo ( en clipper se poda activar
> explicitamente con Memory(-1) ) , pero hay ciertas operaciones que usan el
> CG ms que otras.
>
> Concretamente aadd() es una de las que mas le "duelen" al CG.
>
>> Actualmente trabajo con la version 1.9 de XBASE  y las bases de datos son
>> DBF grandes e hasta 2000 registros.
>
> Con la 1.9 se mejora mucho el CG y aunque operaciones como aadd() le 
> siguen doliendo, se nota mucho menos.
> De todas formas intentar sacar un poquito de tiempo este fin de semana 
> para publicar un pequeo ejemplo usando listas enlazadas con ot4xb.dll
> que incluso con 1.9 la diferencia de velocidad no solo se sigue notando 
> sino que  adems el impacto sobre el sistema en infinitamente menor que 
> usando aadd()
>
> ( si me pasas la definicion de los campos Num_Comp,P_Peso,Lab,Fase2 monto 
> el ejemplo con los mismos tipos y asi casi te valdria tal cual)
>
> Ahora vamos con lo del filtro
>
> Si tienes algn indice en AreaConc que empiece por NumMezcla ( o Str( 
> NumMezcla , n , nn ) si es numrico )
> deberas reemplazar el filtro por un scope y si no tienes deberas 
> planteartelo, dependiendo de la frecuencia con que necesites hacer esta 
> operacin.
>
> En tu caso lo tienes muy fcil porque el filtro es simple
>
> (AreaConc)->( DbSetScope( SCOPE_BOTH , (AreaPadre)->NumMezcla ) )
> o
> (AreaConc)->( DbSetScope( SCOPE_BOTH , Str((AreaPadre)->NumMezcla 
> ,n,nn) ) )
> si es numerico
>
> Cuando son filtros ms complicados lo que se debe hacer es tratar de 
> reemplazar parte del filtro por un scope lo mas restrictivo posible
> y as se evaluan cuantos menos registros mejor.
>
> Saludos,
> Pablo Botella
> -------------------------------------------------------
> Get The Open Tools for Xbase++
> here: http://www.xbwin.com
> -------------------------------------------------------
>
>
Nolberto PaulinoRe: lentitud de acceso a bases de datos
on Fri, 24 Mar 2006 11:04:54 -0400
Hola Hernesto
Este  codigo de Palblo funciona perfectamenta
        (AreaConc)->( DbSetScope( SCOPE_BOTH , (AreaPadre)->NumMezcla ) )
        (AreaConc)->( DbSetScope( SCOPE_BOTH , (AreaPadre)->NumMezcla ) )
tambien puede hacerlo de esta forma
        (AreaConc)->( DbSetScope( SCOPE_TOP          , 
(AreaPadre)->NumMezcla ) )
        (AreaConc)->( DbSetScope( SCOPE_BOTTOM , (AreaPadre)->NumMezcla ) )

si esto no te funciona por favor explica mejor lo que quiere lograr con los 
filtros de Indices.

Nolberto Paulino
Un cordiar saludo


"Ernesto Avedillo" <eavedillo@iacsl.e.telefonica.net> escribi en el mensaje 
news:7e8478e1$26213350$22880b@news.alaska-software.com...
> Hola Pablo,
>
> La base de datos AreaConc tiene los siguietes Campos;
>
> NumMezcla,"C" , 13, 0
> Num_Comp, "C" , 13, 0
> P_Peso  , "N" , 7 , 3
> Lab     , "L" , 1 , 0
> Fase2   , "L" , 1 , 0
>
> Y esta indexada por NumMezcla + Num_Comp
>
> En relacion al setScope recuerdo que inicialmente tenia programada la 
> rutina de esta manera, pero en determinadas ocasiones (No hablo 
> exclusivamente de esta base de datos sino en otras tantas) no me realizaba 
> correctamente la operacin y finalmente decidi utilizar el DBSetFilter.
> En relacion a este punto, he de decir que he llegado a sustituir la 
> funcion DBSetScope por SET SCOPE TO porque la primera me ha dado ciertos 
> problemas que me solventaba la segunda. (seguro que la culpa es mia pero 
> no he sabido manejarla correctamente).
>
> Lo que realmente me sorprende es que cuando borro los indices y los vuelvo 
> a crear nuevos, el programa no tarda nada en realizar la operacin, pero 
> si espero unas horas en las que haya trabajado con la base de datos, 
> empiezo a tener problemas de velocidad. Ademas, me he encontrado que la 
> lentitud me la causa el DBSKIP; hasta 8 segundos me ha llegado a tardar 
> una sola sentencia en ejecutarse (slo un registro).
>
> Gracias
> Ernesto
>
> "Pablo Botella" <pbn_NOSPAM_@pablob.com> escribi en el mensaje 
> news:787ef152$2b418107$22170c@news.alaska-software.com...
>> Hola,
>>
>> Bueno vamos por pasos
>>
>>> No se lo que es el Garbage colector. Sinceramente no lo he utilizado 
>>> nunca
>>> y si lo he hecho no me he enterado. Alguien me puede explicar lo que es?
>> El colector de basura es un mecanismo interno del runtime de Xbase++ (
>> Clipper tambien tiene su GC)
>> para asignar memoria a las variables y liberarla cuando no hace falta. Tu 
>> no
>> haces nada explcito  para utilizarlo ( en clipper se poda activar
>> explicitamente con Memory(-1) ) , pero hay ciertas operaciones que usan 
>> el
>> CG ms que otras.
>>
>> Concretamente aadd() es una de las que mas le "duelen" al CG.
>>
>>> Actualmente trabajo con la version 1.9 de XBASE  y las bases de datos 
>>> son
>>> DBF grandes e hasta 2000 registros.
>>
>> Con la 1.9 se mejora mucho el CG y aunque operaciones como aadd() le 
>> siguen doliendo, se nota mucho menos.
>> De todas formas intentar sacar un poquito de tiempo este fin de semana 
>> para publicar un pequeo ejemplo usando listas enlazadas con ot4xb.dll
>> que incluso con 1.9 la diferencia de velocidad no solo se sigue notando 
>> sino que  adems el impacto sobre el sistema en infinitamente menor que 
>> usando aadd()
>>
>> ( si me pasas la definicion de los campos Num_Comp,P_Peso,Lab,Fase2 monto 
>> el ejemplo con los mismos tipos y asi casi te valdria tal cual)
>>
>> Ahora vamos con lo del filtro
>>
>> Si tienes algn indice en AreaConc que empiece por NumMezcla ( o Str( 
>> NumMezcla , n , nn ) si es numrico )
>> deberas reemplazar el filtro por un scope y si no tienes deberas 
>> planteartelo, dependiendo de la frecuencia con que necesites hacer esta 
>> operacin.
>>
>> En tu caso lo tienes muy fcil porque el filtro es simple
>>
>> (AreaConc)->( DbSetScope( SCOPE_BOTH , (AreaPadre)->NumMezcla ) )
>> o
>> (AreaConc)->( DbSetScope( SCOPE_BOTH , Str((AreaPadre)->NumMezcla 
>> ,n,nn) ) )
>> si es numerico
>>
>> Cuando son filtros ms complicados lo que se debe hacer es tratar de 
>> reemplazar parte del filtro por un scope lo mas restrictivo posible
>> y as se evaluan cuantos menos registros mejor.
>>
>> Saludos,
>> Pablo Botella
>> -------------------------------------------------------
>> Get The Open Tools for Xbase++
>> here: http://www.xbwin.com
>> -------------------------------------------------------
>>
>>
>
>
Pablo BotellaRe: lentitud de acceso a bases de datos
on Fri, 24 Mar 2006 17:52:18 +0100
Ernesto,

Prueba esto
aItems := (AreaConc)->(ColectConcItems((AreaPadre)->NumMezcla))
a ver como te trabaja ( tienes que enlazarlo con ot4xb.lib ) y luego me 
cuentas si hay diferencia.

( Ojo: En el build 1.2.102 del ot4xb met unos simbolos que se dan de 
narices con la V 1.9 de Xbase++  asegrate de que usas el ultimo ot4xb - 
Build 1.2.103 que puse ayer en la web )

Saludos,
Pablo Botella
-------------------------------------------------------
Get The Open Tools for Xbase++
here: http://www.xbwin.com
-------------------------------------------------------


 ---------------------------------------------------------------------------
#include "ot4xb.ch"
 ---------------------------------------------------------------------------
BEGIN STRUCTURE _AreaConc_Item_
   MEMBER POINTER32 pNext
   MEMBER LONG      nPos
   MEMBER BINSTR Num_Comp  SIZE 13
   MEMBER DOUBLE P_Peso
   MEMBER BOOL   Lab
   MEMBER BOOL   Fase2
END STRUCTURE
 ---------------------------------------------------------------------------
function ColectConcItems( cNumMezcla )
local oItem      := _AreaConc_Item_():New()
local nItemSize  := oItem:_sizeof_()
local pFirst     := _xgrab(nItemSize)
local p  := 0
local pp := 0
local nCount := 0
local aItems
p := pFirst
oItem:_link_(p,.F.)

DbGoTop()
DbSeek( cNumMezcla , .F.)
while( (!Eof()) .and. (FIELD->NumMezcla == cNumMezcla) )
   nCount++
   p := _xgrab(nItemSize)
   oItem:pNext := p
   oItem:_link_(p,.F.)
   oItem:nPos      := nCount
   oItem:Num_Comp  := FIELD->Num_Comp
   oItem:P_Peso    := FIELD->P_Peso
   oItem:Lab       := FIELD->Lab
   oItem:Fase2     := FIELD->Fase2
   DbSkip()
end

aItems :=  Array( nCount , 4 )

oItem:_link_(pFirst,.F.)
p := oItem:pNext

while( p != 0 )
   oItem:_link_(p,.F.)
   p := oItem:pNext
   aItems[oItem:nPos][1] := oItem:Num_Comp
   aItems[oItem:nPos][2] := oItem:P_Peso
   aItems[oItem:nPos][3] := oItem:Lab
   aItems[oItem:nPos][4]  := oItem:Fase2
   oItem:_free_(.F.)
end
oItem:_link_(pFirst,.F.)
oItem:_free_(.F.)

return aItems
 ---------------------------------------------------------------------------





ernesto.zip
Ernesto AvedilloRe: lentitud de acceso a bases de datos
on Mon, 27 Mar 2006 09:30:29 +0200
Hola Pablo,
Ya lo he integrado en la rutina, vere como funciona entre hoy y maana y te 
contare algo.
Gracias de antemano
Ernesto
"Pablo Botella" <pbn_NOSPAM_@pablob.com> escribi en el mensaje 
news:6013cf25$6dbbdd6e$22b1d8@news.alaska-software.com...
> Ernesto,
>
> Prueba esto
> aItems := (AreaConc)->(ColectConcItems((AreaPadre)->NumMezcla))
> a ver como te trabaja ( tienes que enlazarlo con ot4xb.lib ) y luego me 
> cuentas si hay diferencia.
>
> ( Ojo: En el build 1.2.102 del ot4xb met unos simbolos que se dan de 
> narices con la V 1.9 de Xbase++  asegrate de que usas el ultimo ot4xb - 
> Build 1.2.103 que puse ayer en la web )
>
> Saludos,
> Pablo Botella
> -------------------------------------------------------
> Get The Open Tools for Xbase++
> here: http://www.xbwin.com
> -------------------------------------------------------
>
>
>  ---------------------------------------------------------------------------
> #include "ot4xb.ch"
>  ---------------------------------------------------------------------------
> BEGIN STRUCTURE _AreaConc_Item_
>   MEMBER POINTER32 pNext
>   MEMBER LONG      nPos
>   MEMBER BINSTR Num_Comp  SIZE 13
>   MEMBER DOUBLE P_Peso
>   MEMBER BOOL   Lab
>   MEMBER BOOL   Fase2
> END STRUCTURE
>  ---------------------------------------------------------------------------
> function ColectConcItems( cNumMezcla )
> local oItem      := _AreaConc_Item_():New()
> local nItemSize  := oItem:_sizeof_()
> local pFirst     := _xgrab(nItemSize)
> local p  := 0
> local pp := 0
> local nCount := 0
> local aItems
> p := pFirst
> oItem:_link_(p,.F.)
>
> DbGoTop()
> DbSeek( cNumMezcla , .F.)
> while( (!Eof()) .and. (FIELD->NumMezcla == cNumMezcla) )
>   nCount++
>   p := _xgrab(nItemSize)
>   oItem:pNext := p
>   oItem:_link_(p,.F.)
>   oItem:nPos      := nCount
>   oItem:Num_Comp  := FIELD->Num_Comp
>   oItem:P_Peso    := FIELD->P_Peso
>   oItem:Lab       := FIELD->Lab
>   oItem:Fase2     := FIELD->Fase2
>   DbSkip()
> end
>
> aItems :=  Array( nCount , 4 )
>
> oItem:_link_(pFirst,.F.)
> p := oItem:pNext
>
> while( p != 0 )
>   oItem:_link_(p,.F.)
>   p := oItem:pNext
>   aItems[oItem:nPos][1] := oItem:Num_Comp
>   aItems[oItem:nPos][2] := oItem:P_Peso
>   aItems[oItem:nPos][3] := oItem:Lab
>   aItems[oItem:nPos][4]  := oItem:Fase2
>   oItem:_free_(.F.)
> end
> oItem:_link_(pFirst,.F.)
> oItem:_free_(.F.)
>
> return aItems
>  ---------------------------------------------------------------------------
>
>
>
>
Jorge GabuardiRe: lentitud de acceso a bases de datos
on Mon, 27 Mar 2006 20:26:17 -0600
Ernesto

Estoy seguro que las aportaciones de todas las personas son adecuadas y 
mejoraran el "performance", pero una de las instrucciones que estan 
afectando severamente tu programa especialmente si tu archivo tiene muchos 
registros es: DbSetFilter( ) (solo se debe de usar en muy contadas 
ocasiones), cambiala por la sugerencia de Paulino DbSetScope() esta funcion 
trabaja con los indices (los debes tener activados) y es muchisimo mas 
rapida.

saludos

Jorge

"Ernesto Avedillo" <eavedillo@iacsl.e.telefonica.net> wrote in message 
news:c8508d7$740dceca$219897@news.alaska-software.com...
>
> Hola todos, he leido el problema que tiene merche en relacion a la 
> lentitud de acceso a las bases de datos y creo que me podreis dar alguna 
> ayuda.
>
> La rutina de la que voy a hablar es la siguiente:
>
>   (AreaConc)->( DbSetFilter( 
> {||(AreaConc)->NumMezcla==(AreaPadre)->NumMezcla },;
> 
> '('+Str(AreaConc)+')->NumMezcla==('+Str(AreaPadre)+')->NumMezcla' ) )
>   (AreaConc)->( DBGoTop() )
>   Do While !(AreaConc)->( EOF() )
>      AADD(aCompOld, {(AreaConc)->Num_Comp , 
> (AreaConc)->P_Peso,(AreaConc)->Lab,(AreaConc)->Fase2})
>      (AreaConc)->( DBSkip() )
>   EndDo
>
> Esta rutina me ha dado muchos problemas por su lentitud de ejecucion. He 
> realizado un estudio de tiempos y me he dado cuenta de que la sentencia 
> DBSKIP() llegaba a tardar hasta 8 segundos en ejecutarse. (Y solo para un 
> registro)
>
> Cuando borro todos los indices la rutina funciona volando, sin embargo, a 
> medida que pasa el tiempo el problema va degenerando tanto que me ha 
> llegado a colgar el servidor por su lentitud.
>
> Me imagino que este es el mismo problema que tiene merche?
>
> No se lo que es el Garbage colector. Sinceramente no lo he utilizado nunca 
> y si lo he hecho no me he enterado. Alguien me puede explicar lo que es?
>
> Actualmente trabajo con la version 1.9 de XBASE  y las bases de datos son 
> DBF grandes e hasta 2000 registros.
>
> Gracias
> Ernesto
>
>
Ernesto AvedilloRe: lentitud de acceso a bases de datos
on Tue, 28 Mar 2006 13:33:46 +0200
Hla a todos;
Muchas gracias por vuestra ayuda, me ha servido de gran ayuda.

Pablo, en especial a ti porque con tu rutina he conseguido bajar el tiempo 
de proceso de 50 a 0,2 segundos, algo que hasta hoy era impensable para mi.

Saludos
Ernesto

"Jorge Gabuardi" <jgabuardi@prodigy.net.mx> escribi en el mensaje 
news:147acaf$3f614323$25357b@news.alaska-software.com...
>
> Ernesto
>
> Estoy seguro que las aportaciones de todas las personas son adecuadas y 
> mejoraran el "performance", pero una de las instrucciones que estan 
> afectando severamente tu programa especialmente si tu archivo tiene muchos 
> registros es: DbSetFilter( ) (solo se debe de usar en muy contadas 
> ocasiones), cambiala por la sugerencia de Paulino DbSetScope() esta 
> funcion trabaja con los indices (los debes tener activados) y es muchisimo 
> mas rapida.
>
> saludos
>
> Jorge
>
> "Ernesto Avedillo" <eavedillo@iacsl.e.telefonica.net> wrote in message 
> news:c8508d7$740dceca$219897@news.alaska-software.com...
>>
>> Hola todos, he leido el problema que tiene merche en relacion a la 
>> lentitud de acceso a las bases de datos y creo que me podreis dar alguna 
>> ayuda.
>>
>> La rutina de la que voy a hablar es la siguiente:
>>
>>   (AreaConc)->( DbSetFilter( 
>> {||(AreaConc)->NumMezcla==(AreaPadre)->NumMezcla },;
>>
>> '('+Str(AreaConc)+')->NumMezcla==('+Str(AreaPadre)+')->NumMezcla' ) )
>>   (AreaConc)->( DBGoTop() )
>>   Do While !(AreaConc)->( EOF() )
>>      AADD(aCompOld, {(AreaConc)->Num_Comp , 
>> (AreaConc)->P_Peso,(AreaConc)->Lab,(AreaConc)->Fase2})
>>      (AreaConc)->( DBSkip() )
>>   EndDo
>>
>> Esta rutina me ha dado muchos problemas por su lentitud de ejecucion. He 
>> realizado un estudio de tiempos y me he dado cuenta de que la sentencia 
>> DBSKIP() llegaba a tardar hasta 8 segundos en ejecutarse. (Y solo para un 
>> registro)
>>
>> Cuando borro todos los indices la rutina funciona volando, sin embargo, a 
>> medida que pasa el tiempo el problema va degenerando tanto que me ha 
>> llegado a colgar el servidor por su lentitud.
>>
>> Me imagino que este es el mismo problema que tiene merche?
>>
>> No se lo que es el Garbage colector. Sinceramente no lo he utilizado 
>> nunca y si lo he hecho no me he enterado. Alguien me puede explicar lo 
>> que es?
>>
>> Actualmente trabajo con la version 1.9 de XBASE  y las bases de datos son 
>> DBF grandes e hasta 2000 registros.
>>
>> Gracias
>> Ernesto
>>
>>
>
>
>