Ich habe den Code geändert, um mit zwei Dateien zu arbeiten. to_search.txt muss durchsucht werden. big_file.fastq hat Zeilen, die durchsucht werden sollen, und wenn eine Zeichenfolge gefunden wird (2 Nichtübereinstimmungen mit exakter Länge zulässig, die von 8-10 reichen, kein Hinzufügen und Löschen), in den entsprechenden Namen einfügen. So wird jede Zeichenfolge in allen Zeilen (2. Zeile) in big_file.fastq gesucht.Der schnellste Weg, um einen String mit zwei Unstimmigkeiten in großen Dateien in Perl zu suchen?
# to_search.txt: (length can be from 8-20 characters)
1 TCCCTTGT
2 ACGAGACT
3 GCTGTACG
4 ATCACCAG
5 TGGTCAAC
6 ATCGCACA
7 GTCGTGTA
8 AGCGGAGG
9 ATCCTTTG
10 TACAGCGC
#2000 search needed
# big_file.fastq: 2 billions lines (each 4 lines are associated: string search is in second line of each 4 lines).
# Second line can have 100-200 characters
@M04398:19:000000000-APDK3:1:1101:21860:1000 1:N:0:1
TCttTTGTGATCGATCGATCGATCGATCGGTCGTGTAGCCTCCAACCAAGCACCCCATCTGTTCCAAATCTTCTCCCACTGCTACTTGAAGACGCTGAAGTTGAAGGGCCACCTTCATCATTCTGG
+
#[email protected]@<FFGGGGGFE9FGGGFEACE8EFFFGGGGGF9F?CECEFEG,CFGF,[email protected]?BFFG<,9<9AEFG,,
@M04398:19:000000000-APDK3:1:1101:13382:1000 1:N:0:1
NTCGATCGATCGATCGATCGATCGATCGTTCTGAGAGGTACCAACCAAGCACACCACGGGCGACACAGACAGCTCCGTGTTGAACGGGTTGTTCTTCTTCTTGCCTTCATCATCCCCATCCTCAGTGGACGCAGCTTGCTCATCCTTCCTC
+
#8BCCGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
@M04398:19:000000000-APDK3:1:1101:18888:1000 1:N:0:1
NCAGAATGAGGAAGGATGAGCCCCGTCGTGTCGAAGCTATTGACACAGCGCTATTCCGTCTTTATGTTCACTTTAAGCGGTACAAGGAGCTGCTTGTTCTGATTCAGGAACCGAACCCTGGTGGTGTGCTTGGTTGGCAAGTTTACGGCTC
+
#8BCCGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGCGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGFGGGGGGGGGGGGGGGGGGGGGGGGGGGE
Hier ist der Code für zwei Fehlpaarungen. Ich habe versucht mit genauem Match, Geschwindigkeit ist nicht schlecht: dauert ungefähr einen Tag. Ich habe das Time :: Progress-Modul verwendet. Wenn ich 2 Mismatch verwende: zeigt 115 Tage bis zum Ende. Wie kann die Geschwindigkeit hier verbessert werden?
#!/usr/bin/perl
use strict;
use warnings;
$| = 1;
open(IN_P1, "big_file.fastq") or die "File not found";
my (@sample_file_names, @barcode1);
open(BC_FILE, "to_search.txt") or die "No barcode file";
my @barcode_file_content = <BC_FILE>;
foreach (@barcode_file_content) {
chomp $_;
$_ =~ s/\r//;
$_ =~ s/\n//;
#print $_;
my @elements = split("(\t|,|)", $_);
push @sample_file_names, $elements[0];
push @barcode1, $elements[2];
}
# open FH
my @fh_array_R1;
foreach (@sample_file_names) {
chomp $_;
local *OUT_R1;
open(OUT_R1, ">", "$_\.fq") or die "cannot write file";
push @fh_array_R1, *OUT_R1;
}
# unknown barcode file
open(UNKNOWN_R1, ">unknown-barcode_SE.fq") or die "cannot create unknown-r1 file";
while (defined(my $firstp1 = <IN_P1>)) {
my $p1_first_line = $firstp1;
my $p1_second_line = <IN_P1>;
my $p1_third_line = <IN_P1>;
my $p1_fourth_line = <IN_P1>;
chomp($p1_first_line, $p1_second_line, $p1_third_line, $p1_fourth_line,);
my $matched_R1 = "$p1_first_line\n$p1_second_line\n$p1_third_line\n$p1_fourth_line\n";
for (my $j = 0 ; $j < scalar @barcode1 ; $j++) {
chomp $barcode1[$j];
my $barcode1_regex = make_barcode_fragments($barcode1[$j]);
if ($p1_second_line =~ /$barcode1_regex/i) {
# keep if matched
print { $fh_array_R1[$j] } $matched_R1;
last;
}
else {
#print to unknown;
print UNKNOWN_R1 $matched_R1;
}
}
}
# make two mismatch patterm of barcode
sub make_barcode_fragments {
my ($in1) = @_;
my @subpats;
for my $i (0 .. length($in1) - 1) {
for my $j ($i + 1 .. length($in1) - 1) {
my $subpat = join('',
substr($in1, 0, $i),
'\\w', substr($in1, $i + 1, $j - $i - 1),
'\\w', substr($in1, $j + 1),
);
push @subpats, $subpat;
}
}
my $pat = join('|', @subpats);
#print $pat;
return "$pat";
}
exit;
'Text :: Levenshtein' könnte wenn schneller machen. – Sobrique
@Sobrique: Dies gibt den Abstand zwischen den Strings. Hier wird eine Saite nach einer anderen größeren Saite durchsucht, wie kann die Entfernung hier verwendet werden? Danke – SSh
Ich versuche, den Code zu verstehen: Warum zählen Sie Zeichen im Bereich (ASCII) 1-173 (Oktal 001-255)? –