PDA

Ver la Versión Completa : Rutina que ocupa el 100% del procesador


egostar
07-07-2007, 02:16:52
Hola amigos

Estoy desarrollando un programa que lee un archivo de texto con un While.

Incialmente mi aplicación se bloqueaba y no podía hacer nada, pero en otros hilos vi que podia usar Application.ProcessMessages para que el programa no se bloqueara, bueno pues ahora me he dado cuenta que el uso del procesador está al 100% ya que estoy leyendo linea por linea el archivo y guardo en una base de datos cierta información (cada archivo de texto contiene aproximadamente 20,000 lineas).

¿Hay alguna manera de liberar memoria del uso del procesador?

Muchas gracias

Salud OS.

Edito: Uso Firebird 2.0, Windows XP y Turbo Delphi.

seoane
07-07-2007, 02:53:57
La manera de reducir el uso de la CPU es no usándola :p

Y no bromeo, cuando tu estas en un bucle tu aplicación esta usando todo el tiempo de CPU que puede. Así que mientras no salgas del bucle el uso de la CPU siempre tiende a ser del 100%. La única solución es decirle a nuestra aplicación que se tome un respiro, esto inevitablemente provoca que el proceso sea mas lento pero bajara el uso de la CPU. Tu tendrás que valorar que es lo mas importante.

Traducir esto a código es sencillo:

while Condicion do
begin
// Aqui tu rutina
Sleep(10);
end;

Sleep detiene nuestro proceso y no lo deja continuar hasta que pasa el tiempo que le marcamos. Esto reducirá el tiempo que el proceso esta en ejecución y por lo tanto bajara el uso de la CPU.

Aunque quizá te llegue con esto otro:

while Condicion do
begin
// Aqui tu rutina
Sleep(0);
end;

Aquí Sleep comprueba si hay algún proceso, con la misma prioridad que el nuestro, que esta preparado para ejecutarse y le cede el puesto. Pero si no hay ninguno esperando, Sleep vuelve inmediatamente y nuestro proceso sigue ejecutándose. Así el proceso no se detiene sin necesidad y los demás procesos tienen un poco mas de tiempo.

Como ves usar Sleep ralentiza el proceso, al igual que lo hace usar Application.ProcessMessages, así que eres tu quien tiene que valorar si es necesario usarlo o no. Si la rapidez es importante no lo uses, si lo importante es que el resto del equipo siga siendo "usable" mientras se lleva acabo el proceso usalo sin duda.

egostar
07-07-2007, 03:08:17
Gracias Seoane, pero sucede algo curioso, no tengo problema con los demas programas que este usando en la PC.

Sin embargo si me importa el tiempo ya que cada registro que agrego a la base de datos consume 2 o 3 segundos, pero si estamos hablando de 20,000 registros, aumentar el tiempo me parece dramático.

Tendré que ver como le bajo al tiempo al agregar registros a la base.

Salud OS y nmuchas gracias.

seoane
07-07-2007, 03:11:32
Pues entonces nada, si no molesta al resto de programas que use toda la CPU que quiera :D

Al González
07-07-2007, 07:03:10
¡Hola a todos!

...me importa el tiempo ya que cada registro que agrego a la base de datos consume 2 o 3 segundos, pero si estamos hablando de 20,000 registros, aumentar el tiempo me parece dramático.

Tendré que ver como le bajo al tiempo al agregar registros a la base...
Que tal Eliseo. Hace dos años desarrollé para un cliente de tu zona urbana (mundo pequeño al fin) un componente llamado TMultiADO que le resolvió el problema de tener que insertar miles de registros a través de una aplicación Delphi con la mayor velocidad posible. La esencia de este componente es crear dinámicamente varios hilos y conexiones secundarias para enviar al servidor SQL sentencias Insert de manera simultánea. La clave es que el ciclo de inserciones no se espera a que el servidor responda a una sentencia "Insert Into" para enviarle la siguiente. Los hilos secundarios y sus respectivas conexiones paralelas se crean conforme la demanda y hasta cierto límite de hilos / conexiones, cada hilo que va quedando desocupado se emplea para enviar la siguiente sentencia de la cola. En diferentes pruebas obtuvimos ahorros de tiempo de entre 50 y 75%.

Aquello era para ADO, pero bien podría adaptarse a otro tipo de conexiones como las que tradicionalmente se usan con Firebird (IBX, dbExpress, etc.). Ya expiró el tiempo de "goce exclusivo", así que el código queda disponible para quien lo pueda necesitar (la empresa donde trabajo dispuso distribuir este componente bajo la línea GH, es decir, gratuito).

El único problema es que está un poco empolvado y usa la versión vieja de GH Freebrary (antes Interfaz GH). Por ahora se considera un producto "en revisión", pero igual y les sirve a los interesados, cuando menos de referencia. Estoy en el correo de siempre.

Un abrazo múltiple.

Al González. :)

egostar
07-07-2007, 08:01:21
Muchas gracias Alberto, mas rápido que una bala estaré en contacto contigo.

Salud OS desde este rincón solitario en la Ciudad de los Palacios.

Kipow
07-07-2007, 20:05:39
Se ve interesante esa aplicacion, podrias indicarme donde conseguir el codigo?

egostar
08-08-2007, 20:51:52
Bueno, solo actualizando este hilo, estuve haciendo pruebas y me encontré con la siguiente situación:

Inicialmente le tomaba a mi aplicación algo más de 4 horas procesar 10,000 registros.

El detalle era que por cada registro actualizado abría y cerraba la conexión con la base de datos :o

Me dije, si solo abro la base cuando comienzo el proceso y la cierro al terminar, pues bien lo hice y baje el tiempo a 2 horas y media :)

Seguí buscando como estaba haciendo la inserción de registros y me encontré que por cada registro que agregaba, abria y cerraba la tabla :o

Bueno, me pregunté, porque no quitar esas instrucciones:rolleyes: y solo abro la tabla cuando inicio el proceso y la cierro cuando termina, ya habia funcionado con el asunto de la conectividad con la base de datos, no? :D

Pues bien, ahora procesar 10,000 registros me ocupa de 6 a 7 minutos y el uso del procesador pues ya me viene valiendo dos cosas.:D:D

Salud OS y gracias por las aportaciones a este hilo.

cHackAll
08-08-2007, 21:35:14
Vaya, interesante anecdota. El Firebird utiliza conexion ADO, DAO o que?

egostar
08-08-2007, 21:40:24
Vaya, interesante anecdota. El Firebird utiliza conexion ADO, DAO o que?

Hola amigo cHackAll Utilizo los componentes IBX, no se si son los mejores pero son los que aprendí en su momento y se me hacen muy fáciles.

:rolleyes::rolleyes::rolleyes: no se si haya componentes mejores de utilizar.....

Salud OS.

Al González
09-08-2007, 01:27:20
¡Hola a todos!

Así que ese era el detalle. De haberme fijado antes en la cantidad de registros que mencionas (10000), habría advertido que Firebird no podía ser tan lento. Y mira, si además empleas transacciones verás cómo se reduce muchísimo más el tiempo de espera.

...Utilizo los componentes IBX, no se si son los mejores pero son los que aprendí en su momento y se me hacen muy fáciles.

:rolleyes::rolleyes::rolleyes: no se si haya componentes mejores de utilizar...
También yo los usé durante dos años, pero a partir de 2006 empleo dbExpress (los que inician con "TSQL"). Una de las ventajas es que no te "casas" con una base de datos en particular, incluso le hice una mejora recientemente al TSQLQuery (una propiedad "ClearUnprovidedParams" para que ponga en blanco los parámetros no especificados por el lado cliente, en lugar de hacer un reemplazo total de los mismos). Además de que son estos dbExpress los que tienen más vigencia en las nuevas versiones de Delphi.

De cualquier forma, los IBX son buenos, los usé en varias aplicaciones.

Un abrazo rápido.

Al González. :)