gpt4 book ai didi

perl - 查找并打印所有重叠的 k-mers

转载 作者:行者123 更新时间:2023-12-01 07:32:23 25 4
gpt4 key购买 nike

我正在尝试编写一个 perl 程序,该程序读取 fasta 文件并打印出一个文本文件,其中包含来自序列 (fasta) 文件的所有可用(重叠)长度为 15 k-mer 的文本文件。当我搜索非重叠 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.

提前致谢!

最佳答案

不知道为什么你没有得到你想要的结果。

我想我会按照您的问题描述发布我使用过的 2 个程序。

第一个只是计算我用于测试的文件中的公里数,( fasta_dat.txt)。它不会将它们打印出来,而只是检查有多少 kmer。

#!/usr/bin/perl
use strict;
use warnings;
use Bio::SeqIO;

my $in = Bio::SeqIO->new( -file => "fasta_dat.txt" ,
-format => 'fasta');

my $count_kmers;
my $k = 15;
while ( my $seq = $in->next_seq) {
$count_kmers += $seq->length - $k + 1;
}

print $count_kmers;

__END__
C:\Old_Data\perlp>perl t9.pl
18657

您可以看到计数(在 __END__ 标记之后),18657。当我使用您的代码打印出来时,该计数与 kmers 的计数一致。
#!/usr/bin/perl
use strict;
use warnings;
use 5.014;
use Devel::Size 'total_size';

my $k = 15;
my $input = 'fasta_dat.txt';
my $output = 'kmers.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", $!;
}

<FASTA>; # discard 'first' 'empty' record

my %seen;
while (my $line = <FASTA>){
chomp $line;
my($header, @seq) = split(/\n/, $line);
my $sequence = join '', @seq;

for my $i (0 .. length($sequence) - $k) {
my $kmer = substr($sequence, $i, $k);
print OUTPUT $kmer, "\n" unless $seen{$kmer}++;
}
}
print total_size(\%seen);

更新 我运行的测试显示哈希大小的内存增加了大约 100 倍。我的测试中的 kmer 数量约为 18500。这导致哈希大小为 1.8MB。

对于您的数据,如果 kmers 为 22M,则哈希大小约为 2.2GB。不知道这是否会超出您的内存容量。

关于perl - 查找并打印所有重叠的 k-mers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40228470/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com