如何找到的物理内存在Perl哈希占用的金额是多少?(How to find the amount o

2019-06-24 14:10发布

我有一个Perl脚本,我使用哈希表的维护非常简单的缓存。 我想清除散列一旦它占据多于n个字节,以避免Perl的(32位)运行内存和崩溃。

我可以做的键 - 值对的数量进行检查:

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

但是,它可以检查通过哈希占用的实际内存?

Answer 1:

杰韦利::大小是回答你的问题。 (请注意,杰韦利::大小将暂时处理大型数据结构时,分配的内存显著量,所以它不是真的很适合这个目的。)

然而, 高速缓存:: SizeAwareMemoryCache和领带::缓存已经实现您要查找的内容(与有些不同的接口),并可以节省你从重新发明轮子。

memoize的是一个模块,可以很方便地从一个函数缓存的返回值。 它没有实现基于大小的缓存限制,但它应该是可以使用领带::缓存为memoize的后端。



Answer 2:

您正在寻找杰韦利::大小

名称

杰韦利::大小 - 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);


Answer 3:

您可以安装杰韦利::尺寸 ,找出在Perl的任何结构所采取的内存。 但是千万要注意,这将需要大量的中间存储器的,所以我不会用它对付一个大的数据结构。 如果你认为你可能即将耗尽内存我肯定不会做。

BTW有许多关于CPAN好模块做缓存在内存中,否则。 而不是推出自己我会建议使用其中的一种替代。 例如尝试领带::缓存:: LRU为在内存中缓存只会上升到键指定数量。



Answer 4:

您可以使用杰韦利::大小来确定所使用的内存,但你不能普遍给予退货内存的操作系统。 这听起来像你只是想明确和重用,虽然,这应该能正常运行。

如果缓存的功能,可以考虑使用memoize的模块,而不是维护自己的高速缓存。 它支持缓存过期(通过memoize的::到期),这样你可以限制高速缓存的大小,并未完全破坏它。



Answer 5:

如果你担心管理的Perl的是使用的内存量,你应该看看另一种方法。 为什么你需要多大的RAM,可以一次全部? 如果你正在使用某种形式的持久性系统的?



Answer 6:

高速缓存存储器

use Cache::Memory;

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

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


Answer 7:

正如其他人所说,缓存是不是你需要重新发明轮子,有大量的关于CPAN简单的缓存解决方案这会为您做的工作很好。

缓存:: SizeAwareMemoryCache可以告诉你想要使用的最大尺寸,那么你可以把它关心缓存为您服务。



文章来源: How to find the amount of physical memory occupied by a hash in Perl?
标签: perl memory hash