Página 1 de 1

Muy lento un ArrayBrowse trabajando en Red

Publicado: Vie Jun 01, 2012 3:52 am
por Moises Leon
Hola a todos
Como parte de un sisitema, tengo una agenda manejada con un oArrayBrowse.
Este control se llena con la informacion de varias tablas de las que tengo
que ir buscando la informacion con seek (cdx). Tambien, dependiendo del tipo
de información, las celdas van formateadas de uno u otro color (les anexo la
imagen).
Todo esta de maravilla, pero es cosa de que entra en red otra persona a la
Agenda y tarda mucho tiempo en desplegarse, 20 a 30 segundos o hasta mas a
veces, lo cual pues es
muchisimo tiempo ademas, para un array de 8x30.
Que puedo hacer para agilizar esto?
Que estoy haciendo mal?
Les anexo las funciones en las que armo el arreglo y con la que
cambio los colores.
Estoy usando Xalier 2.3.2
Saludos y muchas gracias por su ayuda.
Moises Leon
--

Attached files Agenda.zip (47.9 KB)Â

Muy lento un ArrayBrowse trabajando en Red

Publicado: Vie Jun 01, 2012 9:46 am
por jfgimenez
Moisés,
en mi opinión el problema está en cómo estás cargando los datos. En una
rápida mirada, he visto un bucle simple y dos bucles anidados.
Suponiendo que trabajas con 20 tramos horarios (contando de 30 en 30
minutos), para una sola semana se ejecutan más de 2200 SEEKs en esa
rutina, lo que evidentemente está causando dicha lentitud. Hay que tener
en cuenta que cuando las tablas están abiertas por un único proceso y
usuario, windows las trata como si estuvieran abiertas en modo
exclusivo, acelerando muchí­simo todos los accesos. Pero en cuanto son
abiertas por un segundo proceso o usuario, desaparece todo tratamiento
de caché, tanto de lectura como de escritura sobre la tabla, siendo
todos los accesos mucho más lentos. Eso es lo del antaño famoso
"oportunistic lock" de windows.
Teniendo en cuenta que lo normal es que al final sólo haya unas pocas
entradas en toda la semana (en la imagen aparecen 8 solamente), es
muchí­simo más eficiente cambiar la lógica de la rutina, recorriendo las
tablas en el periodo marcado por la semana en vez de hacer los bucles y
buscar en las tablas. Es decir, es mejor hacer algo así­:
dFecha := <fecha inicial de la semana>
DBSeek( DTOS( dFecha ), .T. )
WHILE FIELD->FECHA <= dFecha + 6 .AND. !EOF()
<procesar la entrada y meterla en el array del browse>
SKIP
ENDDO
por cada tabla que necesites. Si en total tienes unas 10 tablas, tendrás
sólo 10 SEEKs y 10 bucles simples, que en la mayorí­a de los casos ni
siquiera se van a ejecutar porque no habrá datos. Pruébalo y verás como
cambia radicalmente.
Por otro lado, lo mejor hubiera sido hacer todo eso con SQL, ya que una
única sentencia SQL te puede devolver toda la información requerida en
un único array, que incluso podrí­a estar formateado para asignarlo al
arraybrowse directamente, sin más procesamiento dentro de tu programa.
Un saludo,
José F. Giménez
http://www.xailer.com
http://www.xailer.info

Muy lento un ArrayBrowse trabajando en Red

Publicado: Vie Jun 01, 2012 11:55 am
por ignacio
Moises Leon escribió el vie, 01 junio 2012 03:52Hola a todos
Como parte de un sisitema, tengo una agenda manejada con un oArrayBrowse.
Este control se llena con la informacion de varias tablas de las que tengo
que ir buscando la informacion con seek (cdx). Tambien, dependiendo del tipo
de información, las celdas van formateadas de uno u otro color (les anexo la
imagen).
Todo esta de maravilla, pero es cosa de que entra en red otra persona a la
Agenda y tarda mucho tiempo en desplegarse, 20 a 30 segundos o hasta mas a
veces, lo cual pues es
muchisimo tiempo ademas, para un array de 8x30.
Que puedo hacer para agilizar esto?
Que estoy haciendo mal?
Les anexo las funciones en las que armo el arreglo y con la que
cambio los colores.
Estoy usando Xalier 2.3.2
Saludos y muchas gracias por su ayuda.
Moises Leon
--
Advantage local, que es gratuito, en mi opinión, es bastante más rápido en entornos de red que los drivers nativos de [x]Harbour.
Saludos

Muy lento un ArrayBrowse trabajando en Red

Publicado: Vie Jun 01, 2012 4:45 pm
por Moises Leon
Muchas gracias por la clase
Moises Leon
"Jose F. Gimenez" <jfgimenezAM]"@wanadoo.es> escribió en el mensaje
de noticias news:4fc87366$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
> Moisés,
>
> en mi opinión el problema está en cómo estás cargando los datos. En una
> rápida mirada, he visto un bucle simple y dos bucles anidados. Suponiendo
> que trabajas con 20 tramos horarios (contando de 30 en 30 minutos), para
> una sola semana se ejecutan más de 2200 SEEKs en esa rutina, lo que
> evidentemente está causando dicha lentitud. Hay que tener en cuenta que
> cuando las tablas están abiertas por un único proceso y usuario, windows
> las trata como si estuvieran abiertas en modo exclusivo, acelerando
> muchí­simo todos los accesos. Pero en cuanto son abiertas por un segundo
> proceso o usuario, desaparece todo tratamiento de caché, tanto de lectura
> como de escritura sobre la tabla, siendo todos los accesos mucho más
> lentos. Eso es lo del antaño famoso "oportunistic lock" de windows.
>
> Teniendo en cuenta que lo normal es que al final sólo haya unas pocas
> entradas en toda la semana (en la imagen aparecen 8 solamente), es
> muchí­simo más eficiente cambiar la lógica de la rutina, recorriendo las
> tablas en el periodo marcado por la semana en vez de hacer los bucles y
> buscar en las tablas. Es decir, es mejor hacer algo así­:
>
> dFecha := <fecha inicial de la semana>
> DBSeek( DTOS( dFecha ), .T. )
> WHILE FIELD->FECHA <= dFecha + 6 .AND. !EOF()
> <procesar la entrada y meterla en el array del browse>
> SKIP
> ENDDO
>
> por cada tabla que necesites. Si en total tienes unas 10 tablas, tendrás
> sólo 10 SEEKs y 10 bucles simples, que en la mayorí­a de los casos ni
> siquiera se van a ejecutar porque no habrá datos. Pruébalo y verás como
> cambia radicalmente.
>
> Por otro lado, lo mejor hubiera sido hacer todo eso con SQL, ya que una
> única sentencia SQL te puede devolver toda la información requerida en un
> único array, que incluso podrí­a estar formateado para asignarlo al
> arraybrowse directamente, sin más procesamiento dentro de tu programa.
>
>
> Un saludo,
>
> José F. Giménez
> http://www.xailer.com
> http://www.xailer.info

Muy lento un ArrayBrowse trabajando en Red

Publicado: Vie Jun 01, 2012 11:20 pm
por Moises Leon
Lo tomare en cuenta. Vere tambien esta posibilidad.
Muchas Gracias
Moises Leon