2009-03-20 5 views
3

J'utilise Archive :: Tar :: Streamed pour archiver un répertoire de 4 Go contenant de très petits fichiers de code source et quelques fichiers jar. J'utilise un système avec 4 Go de RAM et j'utilise Archive :: Tar :: Streamed parce que je ne veux pas que mon répertoire entier soit dans la mémoire car il en résulte une insuffisance de mémoire. Je lis les fichiers un par un à partir du répertoire de manière DFS en utilisant File :: Find et en l'écrivant dans le fichier tar en utilisant la méthode add dans Archive :: Tar :: Streamed. À un moment donné, un seul fichier réside dans la mémoire, même alors% MEM de mon processus Perl augmente progressivement. Il s'est élevé à 20%. Il n'y a pas de fichier dans mon répertoire de 800MB. J'ai deux questions ici 1) pourquoi% MEM augmente-t-il progressivement? 2) Pourquoi l'a-t-il monté jusqu'à 20%? Est-ce parce que Archive :: Tar ne libère pas la mémoire après avoir écrit le contenu dans le fichier tar?Pourquoi% MEM augmente-t-il graduellement même si j'utilise Archive :: Tar: Streamed?

Répondre

2

Il n'est pas normal que votre enveloppe de mémoire VSZ augmente lorsque vous traitez vos données de manière orientée flux, et plus encore pour RES (% MEM) qui devrait normalement se stabiliser dans votre type d'application.

Par conséquent, je suspecterais fortement que des références croisées aux données soient conservées (par exemple dans un hachage), ou (moins probable) que des références circulaires soient générées.

Voir ce post, "are there any tools for finding memory leaks in my perl program" pour obtenir des conseils sur le suivi des variables (que ce soit dans votre code ou dans le module que vous utilisez) pour agrandir l'enveloppe mémoire ou conserver les références croisées.

Questions connexes