簡體   English   中英

如果模式在文件中匹配,則在幾秒鍾內完成查找…如果不存在模式,則需要一個小時才能退出循環

[英]Finding done within seconds if pattern matches in file… if pattern is not present takes an hour to exit the loop

open(FH,"some.txt") or die("\nFile not found\n");
my $find;
while(<FH>)
{
     ($find) = $_ =~m/^(scaffold110132\s+6126\s+C\b\s+.+?)(?=\n|$)/;
     print "\n***$find***\n" if ($find);
     last if($find);

}

這是一小段代碼,可以在some.txt文件中找到模式。 如果存在該模式,Perl會立即給出來。 而如果不存在該模式,則代碼需要一個小時才能退出循環。 有人可以幫我說明原因嗎?

some.txt ::大小:: 45Gb內容提取::

scaffold110637  42  A   1   ^!. C
scaffold110637  43  A   1   .   C
scaffold110637  44  T   1   .   C
scaffold110637  45  A   1   .   F
scaffold110637  46  T   1   .   F
scaffold110637  47  T   1   .   F
scaffold110637  48  A   1   .   F
scaffold110637  49  C   1   .   F
scaffold110637  50  A   1   .   H
scaffold110637  51  C   1   .   H

我非常懷疑循環很長時間后,文件中會有一行以scaffold110132開頭的行,然后幾乎與正則表達式匹配,但並不完全匹配。 我懷疑您的腳本陷入了這一行。 也就是說,我懷疑這不是“模式不在文件中”的問題,而是“與正則表達式不匹配但會使速度變慢的行”之一。

我必須承認,我不確定哪種行可以做到這一點-您的行以\\n字符結尾還是以\\r\\n結尾?

但是,我建議兩件事:

首先,請嘗試此操作,因為在找不到該行時可能會更快:(並找到相同的行)

open(FH,"some.txt") or die("\nFile not found\n");
my $find;
while(<FH>)
{
     next unless /^scaffold110132/;
     ($find) = $_ =~ m/^(scaffold110132\s+6126\s+C\s.+)/;
     print "\n***$find***\n" if ($find);
     last if($find);
}

盡管由於我們中的某些人仍然對花費了這么長時間感到好奇,所以您也可以嘗試一下並告訴我們輸出是什么嗎?

use Time::Hires qw( time );
use Data::Dumper;

open(FH,"some.txt") or die("\nFile not found\n");
my ($find, $start, $end);
my $maxtime = 0.0;
my $slowline = '';
while(<FH>)
{
     $start = time;
     ($find) = $_ =~m/^(scaffold110132\s+6126\s+C\b\s+.+?)(?=\n|$)/;
     print "\n***$find***\n" if ($find);
     $end = time;
     if ($end - $start > $maxtime) {
         $slowline = $_;
         $maxtime = $end - $start;
     }
     last if($find);
}
print Data::Dumper->Dump([$maxtime, $slowline], [qw($maxtime $slowline)]);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM