Estoy ejecutando una expresión regular contra un escalar grande. Aunque este partido no es la captura de cualquier cosa, mi proceso crece por 30M después de este partido:¿Por qué mi Perl Regex usa tanta memoria?
# A
if (${$c} =~ m/\G<<\s*/cgs)
{
#B
...
}
$c
es una referencia a una bastante grande escalar (alrededor de 21 millones), pero he comprobado que es pos(${$c})
en la derecha el lugar y la expresión coinciden en el primer carácter, con pos(${$c})
siendo actualizado al lugar correcto después de la coincidencia. Pero como mencioné, el proceso ha crecido en aproximadamente 30M entre #A y #B, a pesar de que no estoy capturando nada con este partido. ¿A dónde va mi memoria?
Editar: Sí, el uso de $&
tenía la culpa. Estamos usando Perl 5.8.8, y mi script usaba Getopt::Declare, que usa el Text::Balanced incorporado. La versión 1.95 de este módulo estaba usando $&
. La versión 2.0.0 que se incluye con Perl 5.10 ha eliminado la referencia a $&
y alivia el problema.
Ciertamente parece que eso es todo. No puedo ejecutar FindAmpersand en mi Perl porque tengo hilos habilitados, por lo que recompilaré Perl solo para ejecutar esta prueba, pero SawAmpersand informa que sí. –
grep o ack también deberían poder decirle si se mencionan en algún lugar de su código. –
Intenté eso y no encontré nada en mi código, así que finalmente comencé a analizar todas las bibliotecas en @INC, y finalmente lo reduje a GetOpt :: Declare, que estaba usando $ &. Deshacerse de esa biblioteca fue un gran paso para solucionar mis problemas de uso de memoria. –