我有一个Perl脚本,我使用哈希表的维护非常简单的缓存。 我想清除散列一旦它占据多于n个字节,以避免Perl的(32位)运行内存和崩溃。
我可以做的键 - 值对的数量进行检查:
if (scalar keys %cache > $maxSize)
{
%cache = ();
}
但是,它可以检查通过哈希占用的实际内存?
我有一个Perl脚本,我使用哈希表的维护非常简单的缓存。 我想清除散列一旦它占据多于n个字节,以避免Perl的(32位)运行内存和崩溃。
我可以做的键 - 值对的数量进行检查:
if (scalar keys %cache > $maxSize)
{
%cache = ();
}
但是,它可以检查通过哈希占用的实际内存?
杰韦利::大小是回答你的问题。 (请注意,杰韦利::大小将暂时处理大型数据结构时,分配的内存显著量,所以它不是真的很适合这个目的。)
然而, 高速缓存:: SizeAwareMemoryCache和领带::缓存已经实现您要查找的内容(与有些不同的接口),并可以节省你从重新发明轮子。
memoize的是一个模块,可以很方便地从一个函数缓存的返回值。 它没有实现基于大小的缓存限制,但它应该是可以使用领带::缓存为memoize的后端。
您正在寻找杰韦利::大小
杰韦利::大小 - 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的任何结构所采取的内存。 但是千万要注意,这将需要大量的中间存储器的,所以我不会用它对付一个大的数据结构。 如果你认为你可能即将耗尽内存我肯定不会做。
BTW有许多关于CPAN好模块做缓存在内存中,否则。 而不是推出自己我会建议使用其中的一种替代。 例如尝试领带::缓存:: LRU为在内存中缓存只会上升到键指定数量。
您可以使用杰韦利::大小来确定所使用的内存,但你不能普遍给予退货内存的操作系统。 这听起来像你只是想明确和重用,虽然,这应该能正常运行。
如果缓存的功能,可以考虑使用memoize的模块,而不是维护自己的高速缓存。 它支持缓存过期(通过memoize的::到期),这样你可以限制高速缓存的大小,并未完全破坏它。
如果你担心管理的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可以告诉你想要使用的最大尺寸,那么你可以把它关心缓存为您服务。