Comment trouver la quantité de mémoire physique occupée par un hachage dans Perl?

StackOverflow https://stackoverflow.com/questions/106555

  •  01-07-2019
  •  | 
  •  

Question

J'ai un script Perl dans lequel je gère un cache très simple à l'aide d'une table de hachage. J'aimerais effacer le hachage une fois qu'il occupe plus de n octets, afin d'éviter que Perl (32 bits) ne manque de mémoire et ne se plante pas.

Je peux vérifier le nombre de paires clé-valeur:

if (scalar keys %cache > $maxSize)
 {
 %cache = ();
 }

Mais est-il possible de vérifier la mémoire réelle occupée par le hachage?

Était-ce utile?

La solution

Devel :: Size est la réponse à votre question. (Notez que Devel :: Size allouera temporairement une quantité de mémoire importante lors du traitement d'une structure de données volumineuse. Elle n'est donc pas vraiment adaptée à cet usage.)

Cependant, Cache :: SizeAwareMemoryCache et Tie :: Cache implémente déjà ce que vous recherchez (avec des interfaces quelque peu différentes) et pourrait vous éviter de réinventer le roue.

Memoize est un module qui simplifie la mise en cache de la valeur renvoyée par une fonction. Il n'implémente pas de limite de cache basée sur la taille, mais il devrait être possible d'utiliser Tie :: Cache en tant que backend pour Memoize.

Autres conseils

Vous recherchez Devel :: Size

NOM

Devel :: Size - Extension Perl pour trouver l'utilisation de la mémoire des variables Perl

SYNOPSIS

use Devel::Size qw(size total_size);

my $size = size("A string");
my @foo = (1, 2, 3, 4, 5);
my $other_size = size(\@foo);
my $foo = {a => [1, 2, 3],
        b => {a => [1, 3, 4]}
       };
my $total_size = total_size($foo);

Vous pouvez installer Devel :: Size pour connaître la mémoire utilisée par toute construction en Perl. Cependant, sachez que cela nécessitera une grande quantité de mémoire intermédiaire, je ne l'utiliserais donc pas contre une structure de données volumineuse. Je ne le ferais certainement pas si vous pensiez être à court de mémoire.

BTW: CPAN contient un certain nombre de bons modules pour la mise en cache en mémoire et autres. Plutôt que de vous lancer vous-même, je vous suggèrerais d'utiliser l'un d'entre eux. Par exemple, essayez Tie :: Cache :: LRU pour une cache mémoire qui ira seulement jusqu’à un nombre spécifié de clés.

Vous pouvez utiliser Devel :: Size pour déterminer la mémoire utilisée, mais vous ne pouvez généralement pas restituer de la mémoire au système d'exploitation. On dirait que vous essayez simplement de nettoyer et de réutiliser, ce qui devrait bien fonctionner.

Si le cache concerne une fonction, envisagez d'utiliser le module Memoize au lieu de conserver le cachez-vous. Il prend en charge l’expiration du cache (via Memoize :: Expire) afin que vous puissiez limiter la taille du cache sans le détruire entièrement.

Si vous souhaitez gérer la quantité de mémoire utilisée par Perl, vous devriez probablement envisager une autre approche. Pourquoi avez-vous besoin de cela en même temps dans la RAM? Devez-vous utiliser une sorte de système de persistance?

Cache :: Mémoire

use Cache::Memory;

my $cache = Cache::Memory->new(
  namespace => 'MyNamespace',
  default_expires => '600 sec'
);

my $size  = $cache->size()
my $limit = $cache->size_limit();

Comme d'autres l'ont déjà dit, la mise en cache n'est pas une roue que vous devez réinventer, il existe de nombreuses solutions de mise en cache simples sur CPAN qui feront le travail correctement pour vous.

Cache :: SizeAwareMemoryCache peut indiquer la taille maximale souhaitée. utiliser, alors vous pouvez le laisser se soucier de la mémoire cache pour vous.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top