Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 是什么导致内存不断增加? 问题_Linux_Perl_Memory - Fatal编程技术网

Linux 是什么导致内存不断增加? 问题

Linux 是什么导致内存不断增加? 问题,linux,perl,memory,Linux,Perl,Memory,我创建了一个简单的perl脚本来读取日志文件并异步处理数据 我面临的问题是,脚本运行的时间越长,它似乎会持续使用更多的内存。这似乎受到它处理的数据量的影响。我遇到的问题是,我无法确定到底是什么在使用所有这些内存,以及它是泄漏还是有什么东西在占用内存 问题: 如何修改下面的脚本,使其不再持续消耗内存 代码 #多线程,可同时读取多个日志文件。 严格使用; 使用警告; 使用线程; 使用线程::队列; 使用线程::共享; my$logq=Thread::Queue->new(); 我的%Server

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

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


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


代码
#多线程,可同时读取多个日志文件。
严格使用;
使用警告;
使用线程;
使用线程::队列;
使用线程::共享;
my$logq=Thread::Queue->new();
我的%Servers:共享;
我的%servername:共享;
子CSV裂缝{
我的$line=shift;
我的$sep=(移位或“,”);
返回(),除非$line;
我的@细胞;
我的$re=qr/(?:^$sep)(?:“([^”]*)”([^$sep]*))/;
而($line=~/$re/g){
my$value=定义的$1?$1:$2;
推送@cells(定义的$value?$value:“”);
}
返回@个单元格;
}
子进程数据
{
while(睡眠(1)){
如果($logq->pending())
{
我的%网站;
我的%回报率;
而($logq->pending()>0){
my$data=$logq->dequeue();
my@fields=csvsplit($data);
$returns{$fields[$#fields-1]}++;
$sites{$fields[$#fields]}++;
}
打印(键%sites)的“counter:$\ux,value=\”$sites{$\u}\“/>\ n”;
打印(键%returns)的“counter:$\u0,value=\”$returns{$\u0}\“/>\n”;
}
}
}
子读取文件
{
我的$myFile=$\u0];

打开(我的$logfile,原因可能是
线程::队列的大小是无限的。如果生产者线程比消费者线程快,队列将继续增长。因此,您只需简单地设置1000个队列项目的限制:

$logq->limit = 1000;

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

为什么要在每一行上重新创建
qr/
呢?关键是要缓存已编译的regexp。请尝试
state$re\u cache={};my$re=($re\u cache{$sep}/=qr/(?:^$sep)(?:“[^]*)”([^$sep]*))/)
@OlegV.Volkov您能解释一下您的命令是做什么的吗?使一个变量在词汇上持久化。它在当前范围内始终保持不变,有点像一个单例。@Oleg的代码创建了一个缓存,按照可能的分隔符存储预编译的正则表达式。它将编译的正则表达式保存在一个持久散列中,并将
$sep
作为键,因此您不会多次使用任何给定的分隔符重新编译regexp。
state
是perl 5.10+的一项功能,用于在离开其作用域之间保留值的变量。
/=
是“已定义”或“已初始化”的,因此将从哈希中检索值(如果该值已经存在或已初始化)。声明如下官方不鼓励在perl中使用基于解释器的线程"。没有明确提到内存泄漏问题,但我不排除这种可能性。我建议您看看
fork
,特别是包装精美的模块请展示一个我应该如何使用pending的示例。谢谢您的回答。我将尝试一下,看看它是否能提高内存使用率。我是否能够但是,对输出进行限制并不意味着队列总是被减少到0?限制队列的大小是否也意味着我将丢失数据?
$logq->limit = 1000;