gpt4 book ai didi

linux - 是什么导致内存不断上升perl?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:11:06 25 4
gpt4 key购买 nike

问题

我创建了一个简单的 perl 脚本来异步读取日志文件和处理数据。

我面临的问题是,脚本运行的时间越长,它似乎会持续使用更多的内存。这似乎受到它处理的数据量的影响。我遇到的问题是我无法确定到底是什么在使用所有这些内存,以及它是泄漏还是有什么东西一直保留着它。


问题

如何修改下面的脚本,使其不再持续消耗内存?


代码

#Multithreaded to read multiple log files at the same time.

use strict;
use warnings;

use threads;
use Thread::Queue;
use threads::shared;

my $logq = Thread::Queue->new();
my %Servers :shared;
my %servername :shared;

sub csvsplit {
my $line = shift;
my $sep = (shift or ',');

return () unless $line;

my @cells;
my $re = qr/(?:^|$sep)(?:"([^"]*)"|([^$sep]*))/;

while($line =~ /$re/g) {
my $value = defined $1 ? $1 : $2;
push @cells, (defined $value ? $value : '');
}

return @cells;
}


sub process_data
{
while(sleep(1)){

if ($logq->pending())
{
my %sites;
my %returns;
while($logq->pending() > 0){
my $data = $logq->dequeue();
my @fields = csvsplit($data);
$returns{$fields[$#fields - 1]}++;
$sites{$fields[$#fields]}++;
}
print "counter:$_, value=\"$sites{$_}\" />\n" for (keys%sites);
print "counter:$_, value=\"$returns{$_}\" />\n" for (keys%returns);

}
}

}

sub read_file
{
my $myFile=$_[0];
open(my $logfile,'<',$myFile) || die "error";
my $Inode=(stat($logfile))[1];
my $fileSize=(stat($logfile))[7];
seek $logfile, 0, 2;
for (;;) {
while (<$logfile>) {
chomp( $_ );
$logq->enqueue( $_ );
}
sleep 5;
if($Inode != (stat($myFile))[1] || (stat($myFile))[7] < $fileSize){
close($logfile);
while (! -e $myFile){
sleep 2;
}
open($logfile,'<',$myFile) || die "error";
$Inode=(stat($logfile))[1];
$fileSize=(stat($logfile))[7];
}
seek $logfile, 0, 1;
}

}


my $thr1 = threads->create(\&read_file,"log");
my $thr4 = threads->create(\&process_data);
$thr1->join();
$thr4->join();

观察和相关信息

当程序有数据要处理时,内存似乎只会增加,如果我只是离开它,它会保持当前的内存使用量。

内存似乎只会随着吞吐量的增加而增加,同时对于大约 2000 行内存每 5 秒增加大约 0.5 Mb。

我没有包含 csv,因为我认为它不相关。如果您这样做并希望我添加它,请给出正当理由。


规范

GNU bash, version 3.2.57(1)-release (s390x-ibm-linux-gnu)
perl, v5.10.0

我查看了其他问题,但找不到太多相关性。如果这是重复的或相关信息在另一个问题中,请随时将其标记为欺骗并检查一下。

如需更多信息,请询问。

最佳答案

原因可能是你的Thread::Queue 的大小是无限的。如果生产者线程比消费者线程快,您的队列将继续增长。所以你应该简单地 limit the size of your queue .例如,要设置 1,000 个队列项的限制:

$logq->limit = 1000;

(顺便说一句,您使用pending 方法的方式是错误的。您应该只在返回值未定义时终止。)

关于linux - 是什么导致内存不断上升perl?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36837868/

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