首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >合并2个或更多的Perl散列引用消耗的内存是两倍还是更少?

合并2个或更多的Perl散列引用消耗的内存是两倍还是更少?
EN

Stack Overflow用户
提问于 2018-09-03 23:02:14
回答 2查看 119关注 0票数 1

给定以下代码,$z引用的散列消耗的内存是否与( %$x, %$y)使用的相同,或多或少?

如果是这样的话,有没有一种方法可以使用单个引用来调用由$x$y引用的散列中的数据,而不会影响性能和内存?

代码语言:javascript
复制
use strict;
use warnings;

my $x = {
    1 => 'a',
    2 => 'b',
};

my $y = {
    3 => 'c',
    4 => 'd',
};

my $z = {
    %$x, %$y
};

更新

散列引用实际上指向使用tieDB_File创建的大型散列。

我想知道是否有可能我可以对这些只使用一个散列,这样我就不需要在内存中转储所有内容。此外,我可能会同时使用其中的两个以上。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-04 07:47:23

绑定散列根本不是散列。它们是子例程的接口。由于它们是代码而不是数据,因此在一般情况下谈论绑定散列的内存和性能是没有意义的。

让我们先来谈谈普通的哈希。

$z = { %$x, %$y };会将%$x%$y的标量复制到%$z中,所以是的,它将占用两倍的内存(假设没有重复的键)。

您可以共享标量:

代码语言:javascript
复制
use Data::Alias qw( alias );
my $z = {};
alias $z->{$_} = $x->{$_} for keys(%$x);
alias $z->{$_} = $y->{$_} for keys(%$y);

您仍然会使用与两个散列中的元素数量成比例的内存,但如果%$x%$y实际上是散列,则使用的内存将比以前少得多。这可能不会为绑定的散列节省任何内存。

另一种方法是根本不合并数据。你自己也可以使用绑定的散列...

代码语言:javascript
复制
package Tie::MergedHashes;
use Carp qw( croak );
sub new     { my $pkg = shift; $pkg->TIEHASH(@_); }
sub TIEHASH { bless [ @_ ], $_[0] }
sub STORE   { croak("Not allowed"); }
sub FETCH   { for (@{$_[0]}) { return $_->{$_[1]} if exists($_->{$_[1]}); } return undef; }
...

my $z = {};
tie %$z, MergedHashes => ($y, $x);
$z->{$key}

...but没有理由让代码看起来像散列。你可以简单地使用一个对象。

代码语言:javascript
复制
package MergedHashes;
use Carp qw( croak );
sub new   { bless [ @_ ], $_[0] }
sub fetch { for (@{$_[0]}) { return $_->{$_[1]} if exists($_->{$_[1]}); } return undef; }
...

my $z = MergedHashes->new($y, $x);
$z->fetch($key)
票数 3
EN

Stack Overflow用户

发布于 2018-09-03 23:10:11

答案很简单,是肯定的。

如果你想要两个hash ref中的所有键而不创建新的hashref,并且假设你没有重复的键,你可以这样做。

代码语言:javascript
复制
use List::Util qw( uniq );

my @keys = uniq( keys( %$x ), keys( %$y ) );

然后从任一数组中获取值,如下所示

代码语言:javascript
复制
my $value = exists $y->{$key} ? $y->{$key} : $x->{$key};

顺便问一下,为什么你使用hash ref而不是hash,为什么内存是你需要问这个问题的一个考虑因素?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52152216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档