Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Consumo de recursos

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio
Mensaje Lun Abr 28, 2008 1:45 pm
Lor
Perlero Nuevo
Perlero Nuevo
Registrado: 28 Abr 2005
Mensajes: 99
Ubicación: Argentina, Santa FE
Consumo de recursos Responder citando

Agradecería, si alguien me pudiese orientar cómo detectar consumo de recursos al ejecutar un Perl.
Tengo una aplicación que accede y trabaja con Mysql. La aplicación con poca carga funciona correctamente. Pero al aumentar el tamaño de los arreglos que la conforman queda trabajando indefinidamente y no hace lo que tendría que hacer. ¿Existe algún límite en el tamaño de las variables (longitud de arreglos)? ¿Cómo puedo testear dónde esta el problema?

Muchas gracias. Very Happy
Mensaje Lun Abr 28, 2008 1:52 pm
kidd
Creador de Perl en Español
Creador de Perl en Español
Registrado: 15 Oct 2003
Mensajes: 1389
Ubicación: México
Responder citando

Hola,

La cantidad de datos que puede contener una variable de Perl está directamente relacionada con la cantidad de memoria que tiene tu máquina. Es decir, en teoría las variables de Perl pueden ser tan grandes como tu memoria lo permita.

Para realizar la optimización que necesitas en tu script, primero debes de realizar un benchmark del mismo para ver en qué parte está el cuello de botella. Para ello existen algunos módulos como el Benchmark.

http://perlenespanol.baboonsoftware.com/tutoriales/modulos/uso_de_benchmark.html

Saludos
Mensaje Lun Abr 28, 2008 6:12 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4130
Ubicación: Valladolid, España
Responder citando

¿En qué sistema operativo estás trabajando?
Mensaje Mar Abr 29, 2008 4:15 am
Lor
Perlero Nuevo
Perlero Nuevo
Registrado: 28 Abr 2005
Mensajes: 99
Ubicación: Argentina, Santa FE
Responder citando

Estoy trabajando bajo Windows, es el sistema optado por mi cliente.
Mensaje Jue May 01, 2008 9:12 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4130
Ubicación: Valladolid, España
Responder citando

Como dijo kidd, el límite es la memoria.

Ahora bien, en un programa Perl hay constantes movimientos de memoria, al crear y destruir nuevas variables o espacios temporales que al final irán a parar a las variables (o no).

Y el tiempo de gestión de memoria puede venir influido por el sistema operativo.

Mi propia experiencia, el año pasado, con un Windows 2000 Profesional y 2003 Server fue desastrosa. Con 1Gb de memoria RAM era casi imposible realizar operaciones con estructuras de datos que almacenaban la información de 2 millones de personas, en forma de array de hashes o hashes de hashes.

En cambio, en el ordenador de Linux que teníamos de pruebas, ni se inmutaba.

En Windows, era imposible que un proceso superara los 700Mb, pues a partir de ese momento la máquina entraba en el proceso de intercambiar páginas de memoria con la memoria cache en disco. Así, un proceso que debería tardar 7 u 8 minutos de ejecución, se alargaba más de 3 horas.

La decisión de los jefes fue muy clara: o gastamos dinero en 1Gb más de memoria o nos pasamos a Linux.

Bueno, 1Gb de memoria no es muy caro, pero dejar de pagar miles de euros al año en licencias Microsoft, sí que era atractivo.

En cuanto a tu problema: mantén en pantalla el Administrador de Tareas (o de Procesos) y fíjate en la cantidad de memoria usada, memoria reservada, memoria en caché y memoria total que tu programa está ocupando. Si llega al límite, la cpu empezará a bajar, mientras que todo el tiempo de ese procesador se dedicará a mover la información entre disco duro y memoria. Si ocurre eso, hay que aplicar algunas técnicas, repasando el código, línea a línea, para detectar dónde se nos va. Ejemplo: no usar bucles for o foreach para procesar los registros, porque un efecto de ellos es que mantienen en memoria a todos ellos, mientras que con un bucle while solo se mantiene un registro cada vez.

Si quieres hacer un análisis más exhaustivo, puedes usar algunos módulos que dan información sobre la memoria ocupada. Uno de ellos es Devel::Size. Con las funciones size y total_size puedes saber cuánto ocupan tus estructuras. Tienes más detalles en Mastering Perl, en la sección Memory use.

Para aún mas detalle, debes recompilar el intérprete Perl con la opción -DDEBUGGING_MSTATS; luego, con la opción mstat() del módulo Devel::Peek. Pero usa solo esa versión para hacer mediciones, no para el trabajo normal, ya que la activación de esa opción de depurado enlentece todo el intérprete perl.

Tienes una presentación de brian d foy con una introducción a estos temas.
Mensaje Jue May 01, 2008 1:52 pm
Lor
Perlero Nuevo
Perlero Nuevo
Registrado: 28 Abr 2005
Mensajes: 99
Ubicación: Argentina, Santa FE
Responder citando

Explorer, muchas gracias por el tiempo que te has tomado para responderme. Tus consejos me son muy valederos.

¡¡¡ Muchas gracias !!!
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group