durch einen Hash in Perl besetzt, wie die Menge des physischen Speichers zu finden?

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

  •  01-07-2019
  •  | 
  •  

Frage

Ich habe einen Perl-Skript, wo ich einen sehr einfachen Cache mit einer Hash-Tabelle halten. Ich mag den Hash löschen, sobald es mehr als n Bytes belegt, Perl (32-Bit) zu vermeiden, aus dem Speicher ausgeführt wird und abstürzt.

Ich kann über die Anzahl der Schlüssel-Wert-Paare einen Scheck tun:

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

Aber ist es möglich, den tatsächlichen Speicher durch den Hash besetzt zu überprüfen?

War es hilfreich?

Lösung

Devel :: Größe ist die Antwort auf Ihre Frage. (Beachten Sie, dass Devel :: Größe wird vorübergehend eine erhebliche Menge an Speicher zuweisen, wenn eine große Datenstruktur der Verarbeitung, so dass es nicht wirklich gut für diesen Zweck.)

Allerdings Cache :: SizeAwareMemoryCache und Memoize ist ein Modul, das es einfach zu cachen, den Rückgabewert aus einer Funktion macht. Es implementiert keine Größe basierte Cache-Grenze, aber es sollte möglich sein, Tie :: Cache für Memoize als Backend zu verwenden.

Andere Tipps

Sie suchen Devel :: Größe

NAME

Devel :: Größe - Perl-Erweiterung für die Speichernutzung von Perl Variablen zu finden

Überblick

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

Sie können die Installation von Devel :: Größe den Speicher genommen, um herauszufinden, von jedes Konstrukt in Perl. Man sollte jedoch beachten Sie, dass es eine große Menge an Zwischenspeicher nehmen, so würde ich es nicht gegen eine große Datenstruktur verwenden. Ich würde es sicherlich nicht tun, wenn Sie denken, Sie werden möglicherweise über genügend Arbeitsspeicher ausgeführt werden.

BTW gibt es eine Reihe von guter Module auf CPAN-Caching im Speicher zu tun und aus anderen Gründen. Anstatt Ihre eigene Rolle würde ich stattdessen mit einem von ihnen vor. Zum Beispiel versuchen Tie :: Cache :: LRU für eine Ein- Speicher-Cache, der nur auf eine bestimmte Anzahl von Tasten steigen.

Sie können mit Devel :: Größe den Speicher verwendet, um zu bestimmen, aber Sie können nicht im allgemeinen Rückkehr Speicher an das Betriebssystem geben. Es klingt wie Sie nur, zu löschen und wiederverwenden versuchen aber, was in Ordnung sollte funktionieren.

Wenn der Cache für eine Funktion ist, sollten Sie die Memoize Modul statt Aufrechterhaltung der cachen selbst. Es unterstützt Cache-Ablauf (via Memoize :: Ablaufen), so können Sie die Größe des Cache-Speichers zu begrenzen, ohne sie vollständig zu zerstören.

Wenn Sie sich Gedanken über die Menge an Speicher verwalten, die mit Perl ist, sollten Sie wahrscheinlich bei einem alternativen Ansatz suchen. Warum brauchen Sie so viel RAM auf einmal? Sollten Sie irgendeine Art von Persistenz-System verwenden?

Cache :: Speicher

use Cache::Memory;

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

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

Wie andere gesagt haben, Caching ist kein Rad Sie brauchen, um neu zu erfinden, es gibt viele einfache Caching-Lösungen auf CPAN ist, die den Job gut für Sie tun.

Cache :: SizeAwareMemoryCache können die maximale Größe, die Sie wollen, dass es gesagt werden, verwenden, dann können Sie lassen Sie es über den Cache für Sie zu kümmern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top