Anzahl der Teilsequenzen in Hunderten von GB Daten

Ich versuche, eine sehr große Datei zu verarbeiten und die Häufigkeit aller Sequenzen einer bestimmten Länge in der Datei zu ermitteln.

Um zu veranschaulichen, was ich tue, betrachten Sie eine kleine Eingabedatei mit der Sequenzabcdefabcgbacbdebdbbcaebfebfebfeb

Below, der Code liest die gesamte Datei ein und nimmt den ersten Teilstring der Länge n (darunter setze ich dies auf 5, obwohl ich dies ändern möchte) und zählt seine Häufigkeit:

abcde => 1

Nächste Zeile, verschiebt ein Zeichen nach rechts und macht dasselbe:

bcdef => 1

Es wird dann für den Rest der Zeichenfolge fortgesetzt und die 5 häufigsten Sequenzen gedruckt:

open my $in, '<', 'in.txt' or die $!; # 'abcdefabcgbacbdebdbbcaebfebfebfeb'

my $seq = <$in>; # read whole file into string
my $len = length($seq);

my $seq_length = 5; # set k-mer length
my %data;

for (my $i = 0; $i <= $len - $seq_length; $i++) {
     my $kmer = substr($seq, $i, $seq_length);
     $data{$kmer}++;
}

# print the hash, showing only the 5 most frequent k-mers
my $count = 0;
foreach my $kmer (sort { $data{$b} <=> $data{$a} } keys %data ){
    print "$kmer $data{$kmer}\n";
    $count++;
    last if $count >= 5;
}
ebfeb 3
febfe 2
bfebf 2
bcaeb 1
abcgb 1

Ich möchte jedoch einen effizienteren Weg finden, um dies zu erreichen. Wenn die Eingabedatei 10 GB oder 1000 GB groß wäre, wäre das Einlesen der gesamten Datei in eine Zeichenfolge sehr speicherintensiv.

Ich habe darüber nachgedacht, Zeichenblöcke, z. B. 100, einzulesen und wie oben beschrieben vorzugehen, aber hier werden Sequenzen, die sich über 2 Blöcke erstrecken, nicht korrekt ausgewertet.

Meine Idee ist es dann, nur n Zeichen aus der Zeichenfolge einzulesen und dann zur nächsten n Zeichenanzahl zu wechseln und das Gleiche zu tun, wobei die Häufigkeit in einem Hash wie oben angegeben gezählt wird.

Gibt es irgendwelche Vorschläge, wie ich das machen könnte? Ich habe mir mal ein @ angeschalese mit einem Offset, aber ich kann nicht verstehen, wie ich das hier einbauen könnteIstsubstr das speichereffizienteste Tool für diese Aufgabe?

Antworten auf die Frage(8)

Ihre Antwort auf die Frage