如何在perl中清除消息_string()后的内存

如何在perl中清除消息_string()后的内存,perl,memory,split,Perl,Memory,Split,我使用PerlV5.18.2和libMail::IMAPClient3.35版。如果电子邮件的大小较大(附件),则方法消息\u字符串会占用大量内存。如果它在使用后被释放,这将不会是一个问题。但是使用这种方法的恶魔不会释放这种记忆。检查时,我使用~30MB大小的Memory::uselib和电子邮件 time vsz ( diff) rss ( diff) shared ( diff) code ( diff) data ( diff)

我使用PerlV5.18.2和lib
Mail::IMAPClient
3.35版。如果电子邮件的大小较大(附件),则方法
消息\u字符串
会占用大量内存。如果它在使用后被释放,这将不会是一个问题。但是使用这种方法的恶魔不会释放这种记忆。检查时,我使用~30MB大小的
Memory::use
lib和电子邮件

time    vsz    (  diff)    rss   (  diff) shared (  diff)   code (  diff)   data  (  diff)
         0  34212  ( 34212)  21272   ( 21272)   5124 (  5124)   1504 (  1504)  16208  ( 16208) before message_string
        18  136180 ( 101968)  120632 ( 99360)   5148 (    24)   1504 (     0)  118156 ( 101948) after message_string
呼叫后
消息\u字符串
我执行
拆分

$message=$imap->message\u字符串($msg);
($header,$body)=拆分/\n\h*\n/,$message,2

time    vsz    (  diff)    rss  (  diff) shared (  diff)   code (  diff)   data  (  diff)
     0  108708 ( 108708)  87560 ( 87560)   5148 (  5148)   1504 (  1504)  90684  ( 90684) before split
     4  141240 ( 32532)  120332 ( 32772)   5148 (     0)   1504 (     0)  123216 ( 32532) after split
这两行占用了守护进程使用的80-90%的资源

如果您能帮助我使用
message\u string
方法,我将不胜感激。 是否有比拆分成本更低的方法

方法来源:

sub message_string {
    my $self = shift;
    my $msg  = shift;
    my $expected_size = $self->size($msg);
    return undef unless(defined $expected_size);    # unable to get size
    my $cmd  =      $self->has_capability('IMAP4REV1')              ? 
                "BODY" . ( $self->Peek ? '.PEEK[]' : '[]' )         : 
                "RFC822" .  ( $self->Peek ? '.PEEK' : ''  )     ;

    $self->fetch($msg,$cmd) or return undef;

    my $string = "";

    foreach my $result  (@{$self->{"History"}{$self->Transaction}}) { 
              $string .= $result->[DATA] 
        if defined($result) and $self->_is_literal($result) ;
    }      
    # BUG? should probably return undef if length != expected
    if ( length($string) != $expected_size ) { 
        carp "${self}::message_string: " .
            "expected $expected_size bytes but received " . 
            length($string) 
            if $self->Debug or $^W; 
    }
    if ( length($string) > $expected_size ) 
    { $string = substr($string,0,$expected_size) }
    if ( length($string) < $expected_size ) {
        $self->LastError("${self}::message_string: expected ".
            "$expected_size bytes but received " . 
            length($string)."\n");
        return undef;
    }
    return $string;
}
子消息\u字符串{
我的$self=shift;
我的$msg=shift;
我的$expected\u size=$self->size($msg);
返回undef,除非(定义为$expected_size)#无法获取大小
我的$cmd=$self->具有_功能('IMAP4REV1')?
“BODY”。($self->Peek?)。Peek[]':'[]'):
“RFC822”。($self->Peek?'.Peek':'');
$self->fetch($msg,$cmd)或return undf;
我的$string=“”;
foreach my$result(@{$self->{“History”}{$self->Transaction}}{
$string.=$result->[数据]
如果定义了($result)并且$self->_是_literal($result);
}      
#BUG?如果长度!=预期值,则可能会返回undef
如果(长度($string)!=$expected_size){
carp“${self}::消息字符串:”。
“预期的$预期的_大小字节,但已收到”。
长度($string)
如果$self->Debug或$^W;
}
if(长度($string)>$expected\u大小)
{$string=substr($string,0,$expected_size)}
if(长度($string)<$expected\u尺寸){
$self->LastError(“${self}::消息字符串:应为”。
“$预期大小字节,但已收到”。
长度($string)。“\n”);
返回未定义;
}
返回$string;
}

一旦程序(Perl)使用了内存,就不能让它将其返回操作系统。它可能会稍后返回,也可能不会。这就是为什么许多守护进程会偶尔重新启动


另请参见。

那么,我的解决方案是什么?