gpt4 book ai didi

Perl 映射/grep 内存泄漏

转载 作者:行者123 更新时间:2023-12-02 16:17:05 24 4
gpt4 key购买 nike

我在工作中一直在做一个perl项目,并且遇到了一个奇怪的内存泄漏。我已将问题的根源归结为一个人为的示例:

#!/usr/bin/perl
use strict;
use warnings;

# takes: an array reference
# returns: 1
sub g {
my ($a) = @_;
return 1;
}

# takes: nothing
# returns: the result of applying g on an array reference
sub f {
my @a = ('a') x 131072; # allocate roughly a megabyte
return g(\@a);
}

# causes a leak:
#map { f($_) } (1..100000);

# loop equivalent to map, no leak:
#my @b;
#for my $i (1..100000) {
# push @b, f($_);
#}

# causes a leak:
#grep { f($_) } (1..100000);

# loop equivalent to grep, no leak:
#my @b;
#for my $i (1..100000) {
# push @b, $i if f($_);
#}

一次取消 4 个代码块中的 1 个(在子例程下方)的注释,并运行脚本,同时监视其内存使用情况。在我的机器上,使用 grep 或 map 的代码似乎会导致内存泄漏,而“循环等效”则不会。我的 perl 版本是 v5.10.1,运行的是 Ubuntu。

我相信这可能是 Perl 中的一个错误,但我不想在没有对可能的原因有其他意见的情况下就得出激烈的结论。谁能解释一下这种行为是否正确?

谢谢

最佳答案

不知道是不是内存泄漏。如果我降低循环的最高值(例如,从 100000 到 100),我可以重复使用 map/grep 表达式而不会丢失内存。

相反,在内存管理方面,mapgrep 似乎更有可能是原子操作,perl 不会在这些操作中间执行垃圾回收。操作。

Perl 5.12.0(和 5.8.9)在这些类型的表达式上看起来确实更强大(但它们似乎也更慢)。

关于Perl 映射/grep 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3363917/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com