ハッシュ テーブルを使用して非常に単純なキャッシュを維持する Perl スクリプトがあります。Perl (32 ビット) のメモリ不足とクラッシュを避けるために、ハッシュが n バイトを超えたらハッシュをクリアしたいと考えています。
キーと値のペアの数を確認できます。
if (scalar keys %cache > $maxSize)
{
%cache = ();
}
しかし、ハッシュが占有する実際のメモリを確認することは可能ですか?
Devel::Sizeがあなたの質問に対する答えです。(大きなデータ構造を処理するとき、Devel::Size は一時的に大量のメモリを割り当てるので、この目的にはあまり適していないことに注意してください。)
ただし、Cache::SizeAwareMemoryCacheとTie::Cacheは、探しているものを (多少異なるインターフェイスで) 既に実装しており、車輪を再発明する手間を省くことができます。
Memoizeは、関数からの戻り値を簡単にキャッシュできるようにするモジュールです。サイズベースのキャッシュ制限は実装していませんが、Memoize のバックエンドとして Tie::Cache を使用できるはずです。
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);
Devel::Sizeをインストールして、Perl の任意の構造体が消費するメモリを調べることができます。ただし、大量の中間メモリが必要になることに注意してください。そのため、大きなデータ構造に対しては使用しません。あなたがメモリを使い果たしそうになっていると思うなら、私は確かにそれをしません.
ところで、CPAN にはメモリ内のキャッシュなどを行う優れたモジュールが多数あります。自分でロールするのではなく、代わりにそれらのいずれかを使用することをお勧めします。たとえば、指定された数のキーまでしか移動しないメモリ内キャッシュのTie::Cache::LRUを試してください。
Devel::Sizeを使用して使用メモリを決定できますが、通常、OS にメモリを返すことはできません。ただし、クリアして再利用しようとしているように思えますが、これはうまくいくはずです。
キャッシュが関数用である場合は、自分でキャッシュを維持する代わりに、 Memoizeモジュールを使用することを検討してください。キャッシュの有効期限 (Memoize::Expire 経由) をサポートしているため、キャッシュを完全に破棄することなく、キャッシュのサイズを制限できます。
use Cache::Memory;
my $cache = Cache::Memory->new(
namespace => 'MyNamespace',
default_expires => '600 sec'
);
my $size = $cache->size()
my $limit = $cache->size_limit();
Perl が使用しているメモリ量の管理について心配している場合は、おそらく別の方法を検討する必要があります。一度に大量の RAM が必要なのはなぜですか? ある種の永続化システムを使用する必要がありますか?
他の人が言っているように、キャッシングは再発明する必要がある車輪ではありません。CPAN には、うまく機能するシンプルなキャッシング ソリューションがたくさんあります。
Cache::SizeAwareMemoryCacheは、使用したい最大サイズを伝えることができます。その後、キャッシュを気にするためにそのままにしておくことができます。