Domanda

Ho uno script Perl in cui mantengo una cache molto semplice usando una tabella hash. Vorrei cancellare l'hash una volta che occupa più di n byte, per evitare che Perl (32 bit) esaurisca la memoria e si blocchi.

Posso fare un controllo sul numero di coppie chiave-valore:

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

Ma è possibile controllare la memoria effettiva occupata dall'hash?

È stato utile?

Soluzione

Devel :: Size è la risposta alla tua domanda. (Nota che Develop :: Size alloca temporaneamente una notevole quantità di memoria durante l'elaborazione di una grande struttura di dati, quindi non è molto adatta a questo scopo.)

Tuttavia, Cache :: SizeAwareMemoryCache e Tie :: Cache implementa già ciò che stai cercando (con interfacce un po 'diverse) e potrebbe salvarti dal reinventare il ruota.

Memoize è un modulo che semplifica la memorizzazione nella cache del valore restituito da una funzione. Non implementa un limite di cache basato sulla dimensione, ma dovrebbe essere possibile utilizzare Tie :: Cache come backend per Memoize.

Altri suggerimenti

Stai cercando Devel :: Size

nome

Devel :: Size - Estensione Perl per trovare l'utilizzo della memoria delle variabili Perl

SINOSSI

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);

Puoi installare Devel :: Size per scoprire la memoria occupata da qualsiasi costrutto in Perl. Tuttavia, tieni presente che ci vorrà una grande quantità di memoria intermedia, quindi non la userei contro una grande struttura di dati. Non lo farei sicuramente se pensi di esaurire la memoria.

A proposito, ci sono un certo numero di buoni moduli su CPAN per fare il caching in memoria e altro. Invece di farne uno tuo, suggerirei invece di usarne uno. Ad esempio, prova Tie :: Cache :: LRU per un in- cache di memoria che andrà fino a un determinato numero di chiavi.

Puoi usare Devel :: Size per determinare la memoria utilizzata, ma generalmente non è possibile fornire memoria di ritorno al sistema operativo. Sembra che tu stia solo cercando di cancellare e riutilizzare, il che dovrebbe funzionare bene.

Se la cache è per una funzione, considera di utilizzare il modulo Memoize invece di mantenere il mettiti in cache. Supporta la scadenza della cache (tramite Memoize :: Expire) in modo da poter limitare la dimensione della cache senza distruggerla del tutto.

Se ti preoccupi della gestione della quantità di memoria utilizzata da Perl, probabilmente dovresti considerare un approccio alternativo. Perché hai bisogno di così tanto in RAM tutto in una volta? Dovresti usare una sorta di sistema di persistenza?

Cache :: Memory

use Cache::Memory;

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

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

Come altri hanno già detto, la memorizzazione nella cache non è una ruota che è necessario reinventare, ci sono molte semplici soluzioni di memorizzazione nella cache su CPAN che faranno il lavoro per te.

Cache :: SizeAwareMemoryCache può essere detto della dimensione massima che desideri utilizzare, quindi puoi lasciarlo per occuparti della cache per te.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top