2017-05-25 137 views
-1

我有一个FASTA文件,其中包含多达2000000个字符串[行]的序列字符串。我编写的代码适合较小的文件,但是当文件的大小增长时,文件的速度会变慢(甚至比较小的文件速度更慢)。我感到困惑的是,为什么文件大小看起来需要更多时间才能达到10万次,即使是在第一次迭代中,如果是10,000次,它的运行效率也非常高。例如:我为每次迭代都放了printf语句。在第一次迭代10,000的情况下需要2 ms。在100000个字符串的情况下,即使第一次迭代需要更多时间,然后2毫秒才能打印等等。为什么它可能会这样慢?性能 - 在C中逐行读取巨大的FASTA文件C

你能帮我提高效率吗?甚至可以像使用较小尺寸的文件一样以相同的速度工作?我正在逐行阅读。 我的代码是

#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); 
+0

您描述的缩放行为的种类似乎合理,但您提供的代码片段不能解释它。如果您希望我们帮助解决问题,您需要提供[mcve]。 –

回答

0

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

0

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