Regex 当文件数量很大时,如何在perl中提高grep效率
我想使用perl从位于以下目录结构中的日志文件中获取一些日志信息: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){
$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命令需要多长时间?)