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