Quel type de problème vous êtes en cours d'exécution, et que signifie "grand" signifie pour vous? J'ai des amis, vous devez charger 200 Go de fichiers en mémoire, de sorte que leur idée de bons conseils est très différent que le budget shopper pour un minimum de VM tranches de souffrance avec 250 Mo de RAM (vraiment? Mon téléphone a plus que cela).
En général, Perl, tient toute la mémoire que vous utilisez, même si il ne l'utilise pas. Réaliser que l'optimisation de la dans une direction, par exemple la mémoire, pourrait avoir un impact négatif de l'autre, comme la vitesse.
Ce n'est pas une liste exhaustive (et il n'y a plus de Programmation Perl):
☹ Utiliser Perl le profilage de la mémoire d'outils pour vous aider à trouver les zones à problème. Voir le Profilage des tas utilisation de la mémoire sur les programmes perl et Comment trouver la quantité de mémoire physique occupé par une table de hachage en Perl?
☹ Utiliser des variables lexicales avec le plus petit périmètre possible afin de permettre à Perl pour la ré-utilisation de la mémoire lorsque vous n'en avez pas besoin.
☹ Éviter de créer de grandes structures temporaires. Par exemple, la lecture d'un fichier avec un foreach
lit toutes les entrées à la fois. Si vous avez seulement besoin de ligne-par-ligne, while
.
foreach ( <FILE> ) { ... } # list context, all at once
while( <FILE> ) { ... } # scalar context, line by line
☹ Vous pourriez même pas besoin d'avoir le fichier en mémoire. Carte mémoire les fichiers au lieu d'aspirer eux
☹ Si vous avez besoin pour créer des structures de données, pensez à quelque chose comme DBM::Profonde ou d'autres moteurs de stockage pour garder la plupart de la mémoire vive et sur le disque jusqu'à ce que vous en avez besoin.
☹ Ne pas laisser les gens utiliser votre programme. Chaque fois que je l'ai fait, j'ai réduit l'empreinte mémoire d'environ 100%. Il réduit également sur les demandes de support.
☹ Passer de gros morceaux de texte et de grands agrégats de référence afin de ne pas faire une copie, ainsi stocker deux fois la même information. Si vous avez à le copier parce que vous voulez changer quelque chose, vous pourriez être coincé. Cela va dans les deux sens comme sous-routine arguments et les valeurs de retour de sous-routine:
call_some_sub( \$big_text, \@long_array );
sub call_some_sub {
my( $text_ref, $array_ref ) = @_;
...
return \%hash;
}
☹ Traquer les fuites de mémoire dans les modules. J'ai eu de gros problèmes avec une application jusqu'à ce que j'ai réalisé qu' un module n'était pas la libération de la mémoire. J'ai trouvé un patch dans le module de la RT file d'attente, appliqué, et résolu le problème.
☹ Si vous avez besoin de gérer un gros morceau de données une fois, mais ne veulent pas de la persistance de la mémoire, de confier les travaux à un processus enfant. Le processus de l'enfant a seulement l'empreinte mémoire pendant qu'il tourne. Lorsque vous obtenez la réponse, le processus de l'enfant s'arrête et la libère de la mémoire. De même, le travail des systèmes de distribution de Gearman, peut se propager de travail entre les machines.
☹ Tour récursive des solutions dans itératif ceux. Perl n'a pas de queue à la récursivité d'optimisation, de sorte que chaque nouveau téléphone, qui s'ajoute à la pile d'appel. Vous pouvez optimiser la queue problème vous-même avec les trucs avec le goto ou d'un module, mais c'est beaucoup de travail pour accrocher une technique que vous n'avez probablement pas besoin.
☹ N'a-t-il 6 Go ou seulement cinq? Eh bien, pour vous dire la vérité, dans toute cette excitation j'ai un peu perdu la trace de moi-même. Mais comme c'est du Perl, le plus puissant de la langue dans le monde, et pourrait faire exploser votre propre mémoire, vous avez obtenu de vous poser une question: j'ai de la chance? Eh bien, pensez-ay, le punk?
Il ya beaucoup plus, mais il est trop tôt dans la matinée pour comprendre ce que ceux qui sont. Je couvre certains en Mastering Perl et Efficace de Programmation Perl.