性能 - 在C中逐行读取巨大的FASTA文件

时间:2017-05-25 12:25:16

标签: c performance file fasta

我有一个FASTA文件,其中包含最多2000000个字符串[lines]的序列字符串。我编写的代码适用于较小的大小,但是当文件大小增加时,它会变慢(甚至比较小的文件速度慢)。令我感到困惑的是,为什么需要花费更多时间才能看到文件大小为100,000甚至是第一次迭代,在10,000的情况下非常有效。 例如:我为每次迭代都输入了printf语句。在10,000次第一次迭代的情况下需要2 ms。在100000字符串的情况下,即使第一次迭代将花费更多时间,然后2 ms打印,依此类推。为什么它会像那样缓慢?

请问您能帮助我如何提高效率,甚至以与小尺寸文件相同的速度工作?我正在逐行阅读。 我的代码是

    #include "kseq.h"
    KSEQ_INIT(gzFile, gzread)


   int z=0;
    fp = gzopen(dbFile, "r");   //Read database Fasta file into host memory
    seq_d = kseq_init(fp);
    while ((d = kseq_read(seq_d)) >= 0) {
            unsigned char *b = (unsigned char *)malloc(sizeof(unsigned char) * 256);

            memcpy(b, seq_d->seq.s, 256);
    ....
    do work with b
     ....
     ............
     z++
     free(b);
    }
    kseq_destroy(seq_d);
    gzclose(fp);

2 个答案:

答案 0 :(得分:0)

我找到了这个问题。我之前没有注意到,但在我的代码中有两个实际运行到文件大小的循环而且不需要(这就是为什么我也得到每次迭代的可变时间)。我只是消除它们,现在它完美无缺。

答案 1 :(得分:0)

为了提高速度,您还可以在' while'之前移动malloc线,并在' while'结束后自由移动。