Comment trouver la quantité de mémoire physique occupé par une table de hachage en Perl?
J'ai un script Perl où je maintenir un très simple de mettre en cache en utilisant une table de hachage. Je tiens à clarifier le hachage une fois il occupe plus de n octets, pour éviter de Perl (32 bits) à cours de mémoire et de s'écraser.
Je peux faire une vérification sur le nombre de touches paires de valeurs:
if (scalar keys %cache > $maxSize)
{
%cache = ();
}
Mais est-il possible de vérifier l'état de la mémoire occupée par le hachage?
OriginalL'auteur Nikhil | 2008-09-20
Vous devez vous connecter pour publier un commentaire.
Devel::Taille est la réponse à votre question. (Notez que Devel::Taille temporairement allouer une quantité importante de mémoire lors du traitement d'une grande structure de données, de sorte qu'il n'est pas vraiment bien adapté à cette fin.)
Cependant, Cache::SizeAwareMemoryCache et Tie::Cache déjà de mettre en œuvre ce que vous cherchez (avec un peu différentes interfaces), et pourrait vous sauver de réinventer la roue.
Memoize est un module qui permet de mettre en cache la valeur de retour d'une fonction. Il n'est pas de mettre en œuvre une taille de cache en fonction de limite, mais il devrait être possible d'utiliser la Cravate::Cache comme un backend pour Memoize.
OriginalL'auteur cjm
Vous êtes à la recherche pour Devel::Taille
NOM
Devel::Taille - extension Perl pour trouver de l'utilisation de la mémoire de Perl variables
SYNOPSIS
pourquoi lors de l'utilisation sur les scalaires comme 5, 6 ou même 60000000000000000000000000000000000000 j'ai toujours le même résultat? Je m'attends à ce qu'au-dessus de 2^63 -1 scalaires prendre octets de plus que de 24 ans, qui est le montant que je reçois @cjm
sauf si vous utilisez bignums, les grands nombres sont stockés en tant que virgule flottante en double précision des valeurs, qui sont toutes de la même taille.
OriginalL'auteur mbac32768
Vous pouvez installer Devel::Taille à savoir la mémoire prise par une construction en Perl. Cependant, soyez conscient qu'il faudra une grande quantité de mémoire intermédiaire, donc je ne voudrais pas l'utiliser contre une grande structure de données. Je ne serait certainement pas le faire si vous pensez que vous pourriez être sur le point de manquer de mémoire.
BTW, il ya un certain nombre de modules sur CPAN pour faire de la mise en cache en mémoire et autrement. Plutôt que de rouler votre propre, je voudrais suggérer à l'aide de l'un d'eux à la place. Par exemple essayer Tie::Cache::LRU pour un cache en mémoire, qui ne va pas jusqu'à un certain nombre de clés.
OriginalL'auteur user11318
Vous pouvez utiliser Devel::Taille pour déterminer la quantité de mémoire utilisée, mais vous ne pouvez pas généralement à donner le retour de la mémoire pour le système d'exploitation. Il semble que vous êtes juste essayer d'effacer et réutiliser, mais, ce qui devrait fonctionner correctement.
Si le cache est pour une fonction, pensez à utiliser le Memoize module au lieu de maintenir le cache soi-même. Il prend en charge l'expiration du cache (via Memoize::Échéance) de sorte que vous pouvez limiter la taille du cache sans la détruire entièrement.
OriginalL'auteur Michael Carman
Si vous êtes à vous soucier de la gestion de la quantité de mémoire que Perl, vous devriez probablement regarder une approche alternative. Pourquoi avez-vous besoin de beaucoup de RAM tout à la fois? Si vous utilisez une sorte de système de persistance?
OriginalL'auteur
Cache::Mémoire
OriginalL'auteur Brad Gilbert
Comme d'autres l'ont dit, la mise en cache n'est pas une roue vous avez besoin de ré-inventer, il ya beaucoup de simples solutions de mise en cache sur le CPAN qui va faire le travail bien pour vous.
Cache::SizeAwareMemoryCache peut être dit que la taille maximum que vous souhaitez utiliser, vous pouvez le laisser à la charge sur le cache pour vous.
OriginalL'auteur David Precious