あなたは多くのデータを持っていて、少し速く何かを必要とする場合は、ここではCソリューションです:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void reader(FILE* in, unsigned long hist[4096]) {
for (unsigned long key=0, count=0;;) {
switch(getc(in)) {
case EOF: return;
case 'A': key <<= 2; break;
case 'C': key <<= 2; key += 1; break;
case 'G': key <<= 2; key += 2; break;
case 'T': key <<= 2; key += 3; break;
default: count=0; continue;
}
if (count == 5) ++hist[key & 0xFFF];
else ++count;
}
}
int putkey(FILE* out, unsigned long key) {
char s[6];
for (int j=6; j--; key >>= 2) s[j] = "ACGT"[key&3];
return fprintf(out, "%.6s", s);
}
void writer(FILE* out, unsigned long hist[4096]) {
for (unsigned long key = 0; key < 4096; ++key) {
fprintf(stdout, "%7lu ", hist[key]);
putkey(out, key);
putchar('\n');
}
}
int main(int argc, char** argv) {
FILE* in = stdin;
if (argc > 1) in = fopen(argv[1], "r");
if (!in) { perror(argv[1]); exit(1); }
unsigned long hist[4096] = {0};
reader(in, hist);
writer(stdout, hist);
return 0;
}
31MBのfastqサンプルを処理するのに半分以下の時間がかかりました(これには、4096個の可能な6文字シーケンスがすべて含まれています)。 Perlの解はそれぞれ12秒(fugu)と18秒(ikegami/borodin)であった。
これは役に立ちます:http://stackoverflow.com/questions/4736626/how-can-i-generate-all-ordered-combinations-of-length-k-in-perl – fugu
正規表現が一致しませんそこにない何か。 –
4文字以上の4文字以上の6文字の組み合わせがあります。あなたは本当に4000行の出力を望んでいますか?大部分はゼロですか? – Borodin