18

ハッシュ テーブルを使用して非常に単純なキャッシュを維持する Perl スクリプトがあります。Perl (32 ビット) のメモリ不足とクラッシュを避けるために、ハッシュが n バイトを超えたらハッシュをクリアしたいと考えています。

キーと値のペアの数を確認できます。

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

しかし、ハッシュが占有する実際のメモリを確認することは可能ですか?

4

7 に答える 7

27

Devel::Sizeがあなたの質問に対する答えです。(大きなデータ構造を処理するとき、Devel::Size は一時的に大量のメモリを割り当てるので、この目的にはあまり適していないことに注意してください。)

ただし、Cache::SizeAwareMemoryCacheTie::Cacheは、探しているものを (多少異なるインターフェイスで) 既に実装しており、車輪を再発明する手間を省くことができます。

Memoizeは、関数からの戻り値を簡単にキャッシュできるようにするモジュールです。サイズベースのキャッシュ制限は実装していませんが、Memoize のバックエンドとして Tie::Cache を使用できるはずです。

于 2008-09-20T01:00:18.163 に答える
11

あなたはDevel::Sizeを探しています

名前

Devel::Size - Perl 変数のメモリ使用量を見つけるための Perl 拡張機能

あらすじ

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);
于 2008-09-20T00:32:22.630 に答える
6

Devel::Sizeをインストールして、Perl の任意の構造体が消費するメモリを調べることができます。ただし、大量の中間メモリが必要になることに注意してください。そのため、大きなデータ構造に対しては使用しません。あなたがメモリを使い果たしそうになっていると思うなら、私は確かにそれをしません.

ところで、CPAN にはメモリ内のキャッシュなどを行う優れたモジュールが多数あります。自分でロールするのではなく、代わりにそれらのいずれかを使用することをお勧めします。たとえば、指定された数のキーまでしか移動しないメモリ内キャッシュのTie::Cache::LRUを試してください。

于 2008-09-20T00:39:40.990 に答える
2

Devel::Sizeを使用して使用メモリを決定できますが、通常、OS にメモリを返すことはできません。ただし、クリアして再利用しようとしているように思えますが、これはうまくいくはずです。

キャッシュが関数用である場合は、自分でキャッシュを維持する代わりに、 Memoizeモジュールを使用することを検討してください。キャッシュの有効期限 (Memoize::Expire 経由) をサポートしているため、キャッシュを完全に破棄することなく、キャッシュのサイズを制限できます。

于 2008-09-20T00:39:28.650 に答える
1

キャッシュ::メモリ

use Cache::Memory;

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

my $size  = $cache->size()
my $limit = $cache->size_limit();
于 2008-09-20T01:31:12.753 に答える
1

Perl が使用しているメモリ量の管理について心配している場合は、おそらく別の方法を検討する必要があります。一度に大量の RAM が必要なのはなぜですか? ある種の永続化システムを使用する必要がありますか?

于 2008-09-22T00:53:38.973 に答える
0

他の人が言っているように、キャッシングは再発明する必要がある車輪ではありません。CPAN には、うまく機能するシンプルなキャッシング ソリューションがたくさんあります。

Cache::SizeAwareMemoryCacheは、使用したい最大サイズを伝えることができます。その後、キャッシュを気にするためにそのままにしておくことができます。

于 2008-12-08T16:38:28.597 に答える