首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提高fastq解析速度

提高fastq解析速度
EN

Stack Overflow用户
提问于 2012-04-25 04:53:55
回答 1查看 701关注 0票数 1

@相同代码的已解算C#快一倍

我正在用phred33解析perl文件,这需要相当多的时间(大约15分钟)。fastq文件大约为3 is。有什么合理的方法可以让这一切变得更快吗?

代码语言:javascript
复制
$file=shift;
open(FILE,$file);
open(FILEFA,">".$file.".fa");
open(FILEQA,">".$file.".qual");
while($line=<FILE>)
{
    chomp($line);
    if($line=~m/^@/)
    {


    $header=$line;
    $header =~ s/@/>/g;
    $seq=<FILE>;
    chomp($seq);
    $nothing=<FILE>;
    $nothing="";
    $fastq=<FILE>;

    print FILEFA $header."\n";
    print FILEFA $seq."\n";
    $seq="";
    print FILEQA $header."\n";

        @elm=split("",$fastq);
        $i=0;
        while(defined($elm[$i]))
        {
            $Q = ord($elm[$i]) - 33;
            if($Q!="-23")
            {
            print FILEQA $Q." ";
            }
            $i=$i+1;
        }
        print FILEQA "\n";
    }
}
print $file.".fa\n";
print $file.".qual\n";
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-25 05:55:09

这里几乎没有使用CPU。它是IO限制的,所以它主要是通过3 3GB读取的时间。有一些微优化(和其他清理)是可以完成的。

首先,始终使用use strict; use warnings;

主要代码是

代码语言:javascript
复制
my @elm = split(//, $fastq);
my $i=0;
while(defined($elm[$i])) {
    my $Q = ord($elm[$i]) - 33;
    if($Q!="-23") {
        print FILEQA $Q." ";
    }
    $i=$i+1;
}

if($Q!="-23")的目的是检查字符是否是换行符,如果使用了chomp($fastq);,就不需要这样做了。(-23周围的引号是什么?!)

代码语言:javascript
复制
chomp($fastq);
my @elm = split(//, $fastq);
my $i=0;
while(defined($elm[$i])) {
    my $Q = ord($elm[$i]) - 33;
    print FILEQA $Q." ";
    $i=$i+1;
}
print FILEQA "\n";

使用while循环只会使事情变得复杂。当你有一个已知的迭代次数时,使用for循环。

代码语言:javascript
复制
chomp($fastq);
for (split(//, $fastq)) {
    print FILEQA (ord($_)-33)." ";
}
print FILEQA "\n";

把它翻过来可能会有一点帮助。

代码语言:javascript
复制
chomp($fastq);
print FILEQA join(' ', map ord($_)-33, split //, $fastq), "\n";

经过深思熟虑,还不够彻底:)

代码语言:javascript
复制
$fastq =~ s/(.)/(ord($1)-33) . " "/eg;
print FILEQA $fastq;

但是我们预计的翻译结果是什么呢?这样我们就不必重复调用sub ( /e代码)了。

代码语言:javascript
复制
my %map = map { chr($_) => ($_-33)." " } 0x00..0xFF;

$fastq =~ s/(.)/$map{$1}/g;
print FILEQA $fastq;

经过更多的清理后,我们得到:

代码语言:javascript
复制
use strict;
use warnings;

my %map = map { chr($_) => ($_-33)." " } 0x00..0xFF;

my $file = shift;

my $fa_file   = "$file.fa";
my $qual_file = "$file.qual";

open(my $FILE,   '<', $file     ) or die $!;
open(my $FILEFA, '>', $fa_file  ) or die $!;
open(my $FILEQA, '>', $qual_file) or die $!;

while (my $header = <$FILE>) {
    next if $header !~ /^@/;

    my $seq = <$FILE>;
    <$FILE>;
    my $fastq = <$FILE>;

    $header =~ s/@/>/g;
    $fastq =~ s/(.)/$map{$1}/g;

    print $FILEFA $header;
    print $FILEFA $seq;

    print $FILEQA $header;
    print $FILEQA $fastq;
}

print "$fa_file\n";
print "$qual_file\n";
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10305841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档