Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.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
Regex 当文件数量很大时,如何在perl中提高grep效率_Regex_Perl_Grep - Fatal编程技术网

Regex 当文件数量很大时,如何在perl中提高grep效率

Regex 当文件数量很大时,如何在perl中提高grep效率,regex,perl,grep,Regex,Perl,Grep,我想使用perl从位于以下目录结构中的日志文件中获取一些日志信息: $jobDir/jobXXXX/host.log其中XXXX是作业编号,从1到几千。$jobDir下没有其他类型的子目录,除了jobXXXX下的日志之外,没有其他文件。剧本是: my @Info; #store the log informaiton my $Num = 0; @Info = qx(grep "information" -r $jobDir); #is this OK ? foreach(@Info){

我想使用perl从位于以下目录结构中的日志文件中获取一些日志信息:
$jobDir/jobXXXX/host.log
其中
XXXX
是作业编号,从1到几千。
$jobDir
下没有其他类型的子目录,除了
jobXXXX
下的日志之外,没有其他文件。剧本是:

my  @Info;  #store the log informaiton
my $Num = 0;
@Info = qx(grep "information" -r $jobDir); #is this OK ?

foreach(@Info){
        if($_=~ /\((\d+)\)(.*)\((\d+)\)/){
            Output(xxxxxxxx);   
        }
        $Num=$Num+1; #number count      
    }
我们发现,当作业编号为几千时,此脚本将花费很长时间输出信息

有没有办法提高它的效率


谢谢

您应该逐个搜索这些日志文件,并逐行扫描每个日志文件,而不是将
grep
的输出读取到内存中(这可能会占用大量内存,降低程序甚至系统的速度):

#未经测试的脚本
我的$Num;
foreach my$log(){

打开我的$logfh,“你应该一个接一个地搜索那些日志文件,并逐行扫描每个日志文件,而不是将
grep
的输出读取到内存中(这可能会占用大量内存,降低程序甚至系统的速度):

#未经测试的脚本
我的$Num;
foreach my$log(){

打开我的$logfh,“,使用perl中内置的匹配会更加优雅(请参阅另一个答案),调用
grep
命令可以更高效、更快,尤其是当有大量数据但只有很少的匹配项时。但调用它的方式是首先运行grep并收集所有数据,然后扫描所有数据。这将需要更多内存,因为您首先收集所有数据,并且必须等待输出,直到所有数据都出来收集。最好在收集第一个数据后立即输出:

open( my $fh,'-|','grep',"information",'-r',$jobDir) or die $!;
while (<$fh>) {
    if(/\((\d+)\)(.*)\((\d+)\)/){
        Output(xxxxxxxx);
    }
    $Num=$Num+1; #number count      
}
open(我的$fh、-|'、'grep'、'information'、'-r'、$jobDir)或die$!;
而(){
如果(/\(\d+)(.*)\(\d+)/){
输出(xxxxxxxx);
}
$Num=$Num+1;#数字计数
}

而使用perl中内置的匹配会更加优雅(参见另一个答案),调用
grep
命令可以更高效、更快,尤其是当有大量数据但只有很少的匹配项时。但调用它的方式是首先运行grep并收集所有数据,然后扫描所有数据。这将需要更多内存,因为您首先收集所有数据,并且必须等待输出,直到所有数据都出来收集。最好在收集第一个数据后立即输出:

open( my $fh,'-|','grep',"information",'-r',$jobDir) or die $!;
while (<$fh>) {
    if(/\((\d+)\)(.*)\((\d+)\)/){
        Output(xxxxxxxx);
    }
    $Num=$Num+1; #number count      
}
open(我的$fh、-|'、'grep'、'information'、'-r'、$jobDir)或die$!;
而(){
如果(/\(\d+)(.*)\(\d+)/){
输出(xxxxxxxx);
}
$Num=$Num+1;#数字计数
}

你可以发布一个简短的
主机日志样本吗?
?Hi@Tuga抱歉,由于日志与我公司的产品相关,我可能无法提供日志。它是否可能与日志的内容相关?每个日志将有几千行和“信息”是随机分布的。您可以将
*
替换为
(?>[^(\n]++\124\(?!\ d+\)*
什么是“非常长的时间”?您是否测试过是否是您的grep占用了时间或之后的内容?(仅使用
/dev/null
的grep命令需要多长时间?)你可以发布一个简短的
host.log
?Hi@Tuga抱歉,由于日志与我公司的产品有关,我可能无法提供日志。它是否可能与日志的内容有关?每个日志将有几千行和“信息”是随机分布的。您可以将
*
替换为
(?>[^(\n]++\124\(?!\ d+\)*
什么是“非常长的时间”?您是否测试过是否是您的grep占用了时间或之后的内容?(仅使用
/dev/null
的grep命令需要多长时间?)