在Perl脚本中,我构建了一个大的哈希值(大约10 GB),大约需要40分钟,大约有1亿个密钥。接下来我想循环遍历哈希的键,如下所示:
foreach my $key (keys %hash) {
然而,此行需要1小时20分钟才能评估!一旦进入for循环,代码就会快速运行整个哈希值。
为什么进入forloop需要这么长时间?我怎样才能加快这个过程?
答案 0 :(得分:8)
foreach my $key (keys %hash) {
此代码将首先创建一个包含%hash
中所有键的列表,并且您说%hash
是巨大的,然后需要一段时间才能完成。特别是如果因为实际内存不足而开始将内存交换到磁盘上。
您可以使用while (my ($key, $value) = each %hash) {
迭代该哈希值,而这个哈希值不会创建那么大的列表。如果你正在交换,这将会更快 ,因为你将不再存在。
答案 1 :(得分:6)
迭代哈希有两种方法,两者各有利弊。
foreach my $k (keys %h)
{
print "key: $k, value: $h{$k}\n";
}
while ( ($k, $v) = each %h )
{
print "key: $k, value: $h{$k}\n";
}
each
时,它使用的内存非常少,只返回一对(key,value)元素。%h
。如果循环内的代码调用keys %h
,values %h
或each %h
,则循环将无法正常工作,因为%h
只有1个迭代器