Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-07-2007
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.557
Poder: 25
egostar Va camino a la fama
Rutina que ocupa el 100% del procesador

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.
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney

Última edición por egostar fecha: 07-07-2007 a las 02:19:52.
Responder Con Cita
  #2  
Antiguo 07-07-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
La manera de reducir el uso de la CPU es no usándola

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:
Código Delphi [-]
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:
Código Delphi [-]
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.
Responder Con Cita
  #3  
Antiguo 07-07-2007
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.557
Poder: 25
egostar Va camino a la fama
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.
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #4  
Antiguo 07-07-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Pues entonces nada, si no molesta al resto de programas que use toda la CPU que quiera
Responder Con Cita
  #5  
Antiguo 07-07-2007
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile

¡Hola a todos!

Cita:
Empezado por egostar
...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.
Responder Con Cita
  #6  
Antiguo 07-07-2007
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.557
Poder: 25
egostar Va camino a la fama
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.
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #7  
Antiguo 07-07-2007
Avatar de Kipow
Kipow Kipow is offline
Miembro
 
Registrado: abr 2006
Ubicación: Guatemala
Posts: 329
Poder: 19
Kipow Va por buen camino
Se ve interesante esa aplicacion, podrias indicarme donde conseguir el codigo?
Responder Con Cita
  #8  
Antiguo 08-08-2007
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.557
Poder: 25
egostar Va camino a la fama
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

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

Bueno, me pregunté, porque no quitar esas instrucciones 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?

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.

Salud OS y gracias por las aportaciones a este hilo.
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #9  
Antiguo 08-08-2007
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
Vaya, interesante anecdota. El Firebird utiliza conexion ADO, DAO o que?
Responder Con Cita
  #10  
Antiguo 08-08-2007
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.557
Poder: 25
egostar Va camino a la fama
Cita:
Empezado por cHackAll Ver Mensaje
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.

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

Salud OS.
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #11  
Antiguo 09-08-2007
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile

¡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.

Cita:
Empezado por egostar Ver Mensaje
...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.

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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Rutina muy lenta... KAYO Firebird e Interbase 10 04-07-2007 17:14:44
Simular Procesador JuanPa1 API de Windows 2 19-06-2007 08:18:15
mi programa ocupa DEMASIADA memoria unreal4u Varios 2 24-04-2005 04:42:05
El saber no ocupa lugar !!!!! LucasArgentino SQL 2 13-11-2003 16:35:03
como repito la grupHeader de QReport cundo el texto del frupo ocupa mas de una pagina orfeo Impresión 1 05-05-2003 09:48:46


La franja horaria es GMT +2. Ahora son las 20:43:26.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi