2010-06-09 11 views
6

Ho bevuto un grosso file usando File :: Slurp ma vista la dimensione del file posso vedere che devo averlo in memoria due volte o forse si sta gonfiando diventando un unicode a 16 bit. Come posso diagnosticare meglio quel tipo di problema in Perl?Quale strumento dovrei usare per scoprire la mia allocazione di memoria in Perl?

Il file che ho inserito ha una dimensione di 800mb e il mio processo perl che analizza i dati ha approssimativamente 1.6gb allocati in fase di esecuzione.

Mi rendo conto che potrei avere torto sulla mia ragione del problema, ma non sono sicuro che il modo più efficace per dimostrare/confutare la mia teoria.

Aggiornamento:

ho elminated codifica dei caratteri poco raccomandabile dalla lista dei sospetti. A un certo punto sembra che copi la variabile, non riesco a capire dove.

Aggiornamento 2:

Ora ho fatto un po 'di indagine e ha scoperto che in realtà è solo ottenere i dati dal File :: Slurp che sta causando il problema. Ho dato un'occhiata attraverso la documentazione e ha scoperto che posso farlo per restituire uno scalar_ref, vale a dire

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

Allora non si ottiene l'inflazione della mia memoria. Il che ha un senso ed è la cosa più logica da fare quando si ottengono i dati nella mia situazione.

Le informazioni sull'esame delle variabili esistenti ecc., Tuttavia, sono generalmente utili, grazie.

+0

Questo post in SO può essere utile: [Come posso determinare a livello di codice l'utilizzo della memoria del mio programma Perl in Windows?] (http://stackoverflow.com/questions/1115743/how-can-i-programmatically-determine- my-perl-programmi-memoria-utilizzo-under-finestre). – Zaid

+0

Questo è generalmente interessante anche se sono dati a quel livello che mi hanno fatto capire che ho questo bug. –

+0

È lo slurping dell'intero file necessario per il processo? L'analisi linea per linea non è possibile? –

risposta

4

Forse Devel::DumpSizes e/o Devel::Size possono dare una mano? Penso che il primo sarebbe più utile nel tuo caso.

Devel :: DumpSizes - Esegue il dump del nome e della dimensione in byte (in ordine crescente) di variabili disponibili in un punto dato in uno script.

Devel :: Size - estensione Perl per trovare l'utilizzo della memoria di variabili Perl

4

Ecco alcune risorse generiche su problemi di memoria in Perl:

Per quanto riguarda il proprio suggerimento, il modo più semplice per smentire sarebbe quella di scrivere un semplice programma Perl che:

  1. Crea un (100M) File di testo normale grande, probabilmente appena uscita la stessa stringa un loop in un file, o per i file binari che eseguono dd comando tramite system() chiamata

  2. leggere il file in utilizzando standard di Perl open()/@a=<>;

  3. consumo di memoria Misura.

Quindi ripetere # 2 # 3 per il file 800M.

Questo vi dirà se il problema è File :: Slurp, qualche logica strana nel vostro programma, o qualche contenuto specifico nel file (per esempio non-ascii, anche se sarei sorpreso se questo dovesse finire per essere il motivo)

+0

Sembra che io abbia eliminato la codifica dei caratteri dubbia. Uno sguardo più ravvicinato rivela che il processo inizia con la stessa impronta di memoria del file, quindi, dopo aver fatto alcune cose nel controllo dell'intestazione, raddoppia. Non riesco a vedere cosa lo sta causando. –

Problemi correlati