我有一个Perl脚本,我使用哈希表维护一个非常简单的缓存.一旦占用超过n个字节,我想清除散列,以避免Perl(32位)耗尽内存并崩溃.
我可以检查键值对的数量:
if (scalar keys %cache > $maxSize)
{
%cache = ();
}
Run Code Online (Sandbox Code Playgroud)
但是有可能检查哈希占用的实际内存吗?
cjm*_*cjm 27
Devel :: Size是您问题的答案.(请注意,Devel :: Size在处理大型数据结构时会暂时分配大量内存,因此它不太适合此目的.)
但是,Cache :: SizeAwareMemoryCache和Tie :: Cache已经实现了你正在寻找的东西(有一些不同的接口),并且可以帮你避免重新发明轮子.
Memoize是一个模块,可以很容易地缓存函数的返回值.它没有实现基于大小的缓存限制,但应该可以使用Tie :: Cache作为Memoize的后端.
mba*_*768 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);
Run Code Online (Sandbox Code Playgroud)
您可以安装Devel :: Size来查找Perl中任何构造所占用的内存.但请注意,它将需要大量的中间内存,因此我不会将它用于大型数据结构.如果你认为你可能会失去记忆,我肯定不会这样做.
顺便说一句,CPAN上有许多好的模块可以在内存中进行缓存.而不是自己滚动我会建议使用其中之一.例如,尝试使用Tie :: Cache :: LRU作为内存缓存,该缓存只能达到指定数量的密钥.