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.