Perl,性能,读取文件

时间:2013-11-07 07:47:43

标签: performance perl file

早上好,我有一些问题需要解决......让我们看看你是否能回答我的问题。

我有一个带核苷酸的.txt(fasta文件)。每行包含124个核苷酸,我需要读取4个核苷酸的密码子(是的,实际上密码子由3个核苷酸组成,但在这里我真的需要读4个4)。所以,因为124是4的倍数,所以我没有问题。

通过这个循环,我在5秒内创建了5个文件输出:

sub sequence() {
    foreach $line (<SEQ>) {
        next if (index($line, ">") != -1);
        some actions........

但是,如果每条线不是4的倍数怎么办?如果每条线的长度为125个核苷酸怎么办?我已经测试了这个机制(连接所有行,忽略了第一个):

sub sequence() {                        #Joining lines from the sequence.
    $one = "";
    while ($line = <SEQ>) {
        next if (index($line, ">") != -1);
        chomp $line;
        $one .= $line; }

但它需要50秒!而不是我最初的5秒。

而不是上面代码中的$one,我也试过以下代码,但它也需要大约50秒....

$contents = do { local $/;  <SEQ> };
$contents =~ s/\A.*?\n//;
$contents =~ tr/\n//;

所以,如果length($line) % 4 !=0 ???

,任何建议让我的脚本更快

谢谢!

1 个答案:

答案 0 :(得分:0)

你的字符串可能增长太久了。尝试而不是加载整个字符串然后处理它,以维护未处理文本的字符串缓冲区:

  • 读一行开始一个字符串(让我们称之为$remaining_codons
  • 阅读接下来的4个密码子(这是您未展示的代码),remove来自$recent_codons。您可以通过从“do stuff”部分获取一个方法来实现此目的,该方法一次消耗尽可能多的密码子4并返回剩余的0到3个密码子。
  • 一旦剩下少于4个密码子:
    • 如果不可能,尝试阅读新行或结束
    • 将新行添加到剩余项目
    • 一次重复阅读4个密码子

重新使用您的第一个代码结构可能会是什么样子

sub sequence() {
    my $remaining_codons = '';
    foreach $line (<SEQ>) {
        next if (index($line, ">") != -1);
        $remaining_codons = $remaining_codons . $line;
        while ( length($remaining_codons) > 3 ) { 
           my $next_codons = substr( $remaining_codons, 0, 4 ); 
           $remaining_codons = substr( $remaining_codons, 4 ); 
           # Do stuff
        }