【发布时间】:2016-10-24 22:18:56
【问题描述】:
我正在尝试编写一个 perl 程序,它读取一个 fasta 文件并打印出一个文本文件,其中包含来自序列 (fasta) 文件的所有可用(重叠)长度为 15 k-mers 的文本文件。当我搜索不重叠的 k-mer 时,该程序运行得非常好,但是当我对其进行编码以找到重叠的 k-mer 时,它需要永远执行,并且 Cygwin 最终在 12 小时后终止了程序。 (我将 match_count 留在那里计算总数,请随意忽略该行)
#!/usr/bin/perl
use strict;
use warnings;
my $k = 15;
my $input = 'fasta.fasta';
my $output = 'text.txt';
my $match_count = 0;
#Open File
unless (open(FASTA, "<", $input)){
die "Unable to open fasta file", $!;
}
#Unwraps the FASTA format file
$/=">";
#Separate header and sequence
#Remove spaces
unless (open(OUTPUT, ">", $output)){
die "Unable to open file", $!;
}
while (my $line = <FASTA>){
my($header, @seq) = split(/\n/, $line);
my $sequence = join '', @seq;
while (length($sequence) >= $k){
$sequence =~ m/(.{$k})/;
print OUTPUT "$1\n";
$sequence = substr($sequence, 1, length($sequence)-1);
}
}
我要找的结果是:
A total of 20938309 k-mers printed in the text file when I use the wc -l command.
提前致谢!
【问题讨论】:
-
您是在寻找总 kmer 数还是需要包含所有 kmer 的文件?
-
生成大约 20M 的子字符串不应该花费 那么 长,即使该循环不是很有效。您的输入文件有多大(字节和记录)?您可以在最后一个
while循环中使用以下内容,以避免大量字符串修改:for my $i (0..length($sequence)-$k) { print OUTPUT substr($sequence, $i, $k), "\n"; } -
@ChrisCharley 我需要一个包含所有 kmers 的文件。我只需要使用 wc -l 命令来确保我总共有 20m kmers。
-
@mbethke 我不确定输入文件的大小。但我假设大小应该大于 20mb。我尝试了您的修改,但执行代码仍然需要很长时间。
-
在我计算机上的一个 20,000 大小的 fasta 文件中,我生成了近 20,000 个重叠的 kmers。
标签: perl