Perl需要花费很长时间来评估:密钥%hash /遍历大散列

时间:2014-04-03 15:12:22

标签: perl hash hashmap

在Perl脚本中,我构建了一个大的哈希值(大约10 GB),大约需要40分钟,大约有1亿个密钥。接下来我想循环遍历哈希的键,如下所示:

foreach my $key (keys %hash) {

然而,此行需要1小时20分钟才能评估!一旦进入for循环,代码就会快速运行整个哈希值。

为什么进入forloop需要这么长时间?我怎样才能加快这个过程?

2 个答案:

答案 0 :(得分:8)

foreach my $key (keys %hash) {

此代码将首先创建一个包含%hash中所有键的列表,并且您说%hash是巨大的,然后需要一段时间才能完成。特别是如果因为实际内存不足而开始将内存交换到磁盘上。

您可以使用while (my ($key, $value) = each %hash) {迭代该哈希值,而这个哈希值不会创建那么大的列表。如果你正在交换,这将会更快 ,因为你将不再存在。

答案 1 :(得分:6)

迭代哈希有两种方法,两者各有利弊。

方法1:

foreach my $k (keys %h)
{
  print "key: $k, value: $h{$k}\n";
}

优点:

  • 可以按键对输出进行排序。

缺点:

  • 它会创建一个临时列表来保存密钥,以防您的哈希值非常大,最终会占用大量内存资源。

方法2:

while ( ($k, $v) = each %h )
{
  print "key: $k, value: $h{$k}\n";
}

优点:

  • 每次调用each时,它使用的内存非常少,只返回一对(key,value)元素。

缺点:

  • 您无法按键排序。
  • 它使用的迭代器属于%h。如果循环内的代码调用keys %hvalues %heach %h,则循环将无法正常工作,因为%h只有1个迭代器