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)Â
In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.
Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.
Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.
Muy lento un ArrayBrowse trabajando en Red
-
- Mensajes: 103
- Registrado: Mié Dic 15, 2010 4:45 pm
Muy lento un ArrayBrowse trabajando en Red
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
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
- ignacio
- Site Admin
- Mensajes: 9457
- Registrado: Lun Abr 06, 2015 8:00 pm
- Ubicación: Madrid, Spain
- Contactar:
Muy lento un ArrayBrowse trabajando en Red
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
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
Ignacio Ortiz de Zúñiga
[OZ Software]
https://www.ozs.es
--
[Equipo de Xailer / Xailer team]
https://www.xailer.com
[OZ Software]
https://www.ozs.es
--
[Equipo de Xailer / Xailer team]
https://www.xailer.com
-
- Mensajes: 103
- Registrado: Mié Dic 15, 2010 4:45 pm
Muy lento un ArrayBrowse trabajando en Red
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
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
-
- Mensajes: 103
- Registrado: Mié Dic 15, 2010 4:45 pm
Muy lento un ArrayBrowse trabajando en Red
Lo tomare en cuenta. Vere tambien esta posibilidad.
Muchas Gracias
Moises Leon
Muchas Gracias
Moises Leon