如何在perl中清除消息_string()后的内存
我使用PerlV5.18.2和lib如何在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)
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)使用了内存,就不能让它将其返回操作系统。它可能会稍后返回,也可能不会。这就是为什么许多守护进程会偶尔重新启动
另请参见。那么,我的解决方案是什么?