2010-06-09 18 views
6

He inhabilitado un archivo grande usando File :: Slurp, pero dado el tamaño del archivo puedo ver que debo tenerlo en la memoria dos veces o quizás se está inflando al convertirlo en unicode de 16 bits. ¿Cómo puedo diagnosticar ese tipo de problema en Perl?¿Qué herramienta debo usar para encontrar mi asignación de memoria en Perl?

El archivo que obtuve tiene un tamaño de 800mb y mi proceso de perl que está analizando esos datos tiene aproximadamente 1.6gb asignados en tiempo de ejecución.

Me doy cuenta de que puedo estar equivocado sobre la razón del problema, pero no estoy seguro de la forma más eficaz de probar/refutar mi teoría.

Actualización:

He elminated poco fiables codificación de caracteres de la lista de sospechosos. Parece que estoy copiando la variable en algún momento, simplemente no puedo averiguar dónde.

Actualización 2:

ahora he hecho un poco más investigación y descubrió que en realidad es sólo conseguir los datos de File :: Slurp que está causando el problema. Tenía una mirada a través de la documentación y descubrí que puedo conseguirlo para devolver una scalar_ref, es decir

my $data = read_file($file, binmode => ':raw', scalar_ref => 1); 

Entonces no reciben la inflación de mi memoria. Lo cual tiene algún sentido y es lo más lógico que hacer cuando obtengo los datos en mi situación.

La información sobre cómo observar qué variables existen, etc. en general ha sido útil, aunque gracias.

+0

Esta publicación de SO puede ser útil: [¿Cómo puedo determinar mediante programación el uso de memoria de mi programa Perl en Windows?] (http://stackoverflow.com/questions/1115743/how-can-i-programmatically-determine- my-perl-programs-memory-use-under-windows). – Zaid

+0

Eso es generalmente interesante, aunque los datos en ese nivel me han hecho darme cuenta de que tengo este error. –

+0

¿Está sorbiendo todo el archivo necesario para su proceso? ¿No es posible un análisis línea por línea? –

Respuesta

4

Tal vez Devel::DumpSizes y/o Devel::Size pueden ayudar? Creo que lo primero sería más útil en tu caso.

Devel :: DumpSizes - Volcar el nombre y el tamaño en bytes (en orden creciente) de las variables que están disponibles en un punto de entrega en un script.

Devel :: Tamaño - extensión Perl para encontrar el uso de la memoria de variables de Perl

4

Éstos son algunos de los recursos genéricos sobre los problemas de memoria en Perl:

En cuanto a su propia sugerencia, la forma más sencilla de refutar sería escribir un simple programa en Perl que:

  1. Crea un (100M) gran archivo de texto sin formato, probablemente, sólo por dar salida a la misma cadena en un bucle en un archivo o archivos binarios que se ejecutan a través de comandos ddsystem() llamada

  2. Leer el archivo en el uso de Perl estándar open()/@a=<>;

  3. consumo de memoria Medida.

Luego repita # 2- # 3 para su archivo de 800M.

Eso te dirá si el problema es File :: Slurp, alguna lógica extraña en tu programa, o algún contenido específico en el archivo (por ejemplo, no ascii, aunque me sorprendería si eso termina siendo el razón)

+0

Parece que eliminé la codificación de caracteres dudosa. Una mirada más cercana revela que el proceso comienza con aproximadamente la misma huella de memoria que el archivo y luego, después de hacer algunas cosas para verificar las cosas en el encabezado, se duplica. Simplemente no puedo ver lo que está causando eso. –

Cuestiones relacionadas