0

大家早上好,我有一些问题要解决……让我们看看你能不能回答我的问题。

我有一个带有核苷酸的 .txt(fasta 文件)。每行包含 124 个核苷酸,我需要读取 4 个核苷酸的密码子(是的,实际上一个密码子由 3 个核苷酸组成,但在这里我真的需要读取 4 x 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???

谢谢!

4

1 回答 1

0

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

  • 读入一行以开始一个字符串(我们称之为$remaining_codons
  • 阅读接下来的 4 个密码子(这是您未显示的代码),remove它们来自$recent_codons. 您可以通过使用“do stuff”部分中的方法来简单地做到这一点,该方法一次消耗尽可能多的密码子并返回剩余的 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
        }
于 2013-11-07T08:14:26.240 回答