Perl でハッシュが占有する物理メモリの量を確認するにはどうすればよいですか?

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

  •  01-07-2019
  •  | 
  •  

質問

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

キーと値のペアの数をチェックできます。

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

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

役に立ちましたか?

解決

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

しかし、 キャッシュ::SizeAwareMemoryCache そして タイ::キャッシュ 探しているものはすでに (多少異なるインターフェイスで) 実装されているため、車輪の再発明の手間を省くことができます。

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

他のヒント

あなたが探しています 開発::サイズ

名前

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

インストールできます 開発::サイズ Perl の任意の構造体が使用するメモリを確認します。ただし、大量の中間メモリを必要とするので、大規模なデータ構造に対しては使用しないことに注意してください。メモリが不足しそうな場合は、絶対にそんなことはしません。

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

使用できます 開発::サイズ 使用されているメモリを特定することはできますが、通常は OS にメモリを返すことはできません。ただし、クリアして再利用しようとしているように見えますが、これは問題なく機能するはずです。

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

Perl が使用しているメモリ量の管理について心配している場合は、おそらく別のアプローチを検討する必要があります。なぜ一度にそれだけの量の RAM が必要になるのでしょうか?何らかの永続化システムを使用する必要がありますか?

キャッシュ::メモリ

use Cache::Memory;

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

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

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

キャッシュ::SizeAwareMemoryCache 使用したい最大サイズを指定できれば、キャッシュの管理は任せておけます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top