注册 登录
编程论坛 C++教室

求优化下程序,这个程序能用,就是运行太慢,求优化下能加快速度

a13780393 发布于 2012-11-09 12:41, 2159 次点击
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>

#define N 65536

struct motif
{
  char name[20];
  float  number;
} lead[N];

void main()
{

/////计算TATA 保守性
   
    FILE *in,*out;
    in=fopen("result1.txt","r");
    out=fopen("结果.txt","w");
    static char s[1687200000];
    char c[4]={'a','g','c','t'};
    int i=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,number=0;
    int person=0;
    float words=0;
    float expect=0;
   
    for(i=0;i<4;i++)
     for(j=0;j<4;j++)
      for(l=0;l<4;l++)
       for(m=0;m<4;m++)
        for(n=0;n<4;n++)
         for(p=0;p<4;p++)
          for(q=0;q<4;q++)
           for(r=0;r<4;r++)
           {
            lead[number].name[0]=c[i];
            lead[number].name[1]=c[j];
            lead[number].name[2]=c[l];
            lead[number].name[3]=c[m];
            lead[number].name[4]=c[n];
            lead[number].name[5]=c[p];
            lead[number].name[6]=c[q];
            lead[number].name[7]=c[r];
            number++;
           }

    while(!feof(in))
    {
      fgets(s,1687200000,in);
      if(s[0]=='@') break;
      for(i=0;i<1687199999;i++)
      {
       for(j=0;j<4;j++)
        for(k=0;k<4;k++)
         for(l=0;l<4;l++)
          for(m=0;m<4;m++)
           for(n=0;n<4;n++)
            for(p=0;p<4;p++)
             for(q=0;q<4;q++)
              for(r=0;r<4;r++)
              {
               if(s[i]==c[j]&&s[i+1]==c[k]&&s[i+2]==c[l]&&s[i+3]==c[m]&&s[i+4]==c[n]&&s[i+5]==c[p]&&s[i+6]==c[q]&&s[i+7]==c[r])
                  lead[person].number++;
               person++;
              }  
       person=0;
       words++;
      }
           
      for(i=0;i<1687199999;i++)
        s[i]=' ';
       }

    fprintf(out,"The Number of total words are %f\n",words);

    expect=words/N;

    fprintf(out,"The Expect Number words are %f\n",expect);


    for(k=0;k<N;k++)        
        fprintf(out,"%s\t%f\t%f\n",lead[k].name,lead[k].number,lead[k].number/65536.0);
   
    fclose(out);
}
这个程序的意思是统计由acgt这四个字母组合成的8长度的字符串,在另一个文件中出现的频数。由这四种字母组成字符串长度为8的方式一共有4的8次方个(65536)。比如:aaaaaaaa、aaaaaaag、aaaaaaac等等 以此类推。另一个文件中也全是由这四种字母组成的,共有16亿长度。我就是想统计这65536个字符串中,在文件2中,每个字符串各出现了多少 次,并依次输出。

[ 本帖最后由 a13780393 于 2012-11-9 18:27 编辑 ]
36 回复
#2
rjsp2012-11-09 14:51
连蒙带猜才搞懂你想干什么鸟事

以下代码通过了 gcc4.7.0 -std=c99 的编译
程序代码:
#include <stdio.h>
#include <string.h>
#include <assert.h>

unsigned long dna8_str2val( const char str[8] )
{
    unsigned long val = 0;
    for( size_t i=0; i<8; ++i )
    {
        val <<= 2;
        switch( str[i] )
        {
        case 'a': val|=0; break;
        case 'g': val|=1; break;
        case 'c': val|=2; break;
        case 't': val|=3; break;
        default: return -1ul;
        }
    }
    return val;
}

void dna8_val2str( unsigned long val, char str[8] )
{
    assert( val < (1ul<<(8*2)) );

    for( size_t i=0; i<8; ++i )
    {
        str[7-i] = "agct"[val%4];
        val >>= 2;
    }
}

int main()
{
    unsigned long words = 0;
    unsigned long numbers[65536] = { 0 };

    // 处理
    FILE* fin = fopen( "result1.txt", "r" );
    if( !fin )
        return 1;
    for( char s[9]; fgets(s,9,fin); )
    {
        if( s[0] == '@' ) // 遇到@则结束
            break;
        ++words;
        size_t len = strlen(s);
        if( len < 8 ) // 此行不足8个字符
            continue;
        if( s[len-1] == '\n' ) // 此行不足8个字符
            continue;

        unsigned long val = dna8_str2val(s);
        if( val == -1ul ) // 出现了agct之外的字符
        {
            fclose( fin );
            return 2;
        }
        ++numbers[val];

        for( int c; c=fgetc(fin), c!=EOF; )
        {
            if( c == '\n' ) // 遇到回车说明此行结束
                break;
            val = (val<<2)&0xFFFF;
            switch( (char)c )
            {
            case 'a': val|=0; break;
            case 'g': val|=1; break;
            case 'c': val|=2; break;
            case 't': val|=3; break;
            default: // 出现了agct之外的字符
                fclose( fin );
                return 2;
            }
            ++numbers[val];
        }
    }
    fclose( fin );

    // 输出
    FILE* fout = fopen( "result2.txt", "w" );
    if( !fout )
        return 3;
    fprintf( fout, "The Number of total words are %ld\n", words );
    fprintf( fout,"The Expect Number words are %f\n", words/65536.0 );
    for( int i=0; i<65536; ++i )
    {
        if( numbers[i] !=0 )
        {
            char str[8];
            dna8_val2str( i, str );
            fprintf( fout, "%.8s\t%ld\t%f\n", str, numbers[i], numbers[i]/65536.0 );
        }
    }
    fclose( fout );

    return 0;
}

测试,result1.txt 内容如下
aaaaaaaaa
aaaaaaaag
aaaaaaaac
@

输出的 result2.txt 内容如下
The Number of total words are 3
The Expect Number words are 0.000046
aaaaaaaa    4    0.000061
aaaaaaag    1    0.000015
aaaaaaac    1    0.000015


[ 本帖最后由 rjsp 于 2012-11-10 13:52 编辑 ]
#3
mmmmmmmmmmmm2012-11-09 14:57
好多循环
#4
a137803932012-11-09 16:41
回复 2楼 rjsp
非常感谢这位仁兄,其实这个文件里只有acgt这四种字母,没有其它的。所以不用遇到其他字母或者汉字怎么办。你能否再改一下啊?修正一下。
#5
rjsp2012-11-09 16:44
回复 4楼 a13780393
改了干球呀,不用改,就这么用
#6
a137803932012-11-09 16:46
回复 2楼 rjsp
也没有空格,就是一个挨着一个的排列,但需要步长为1,逐个向后推,出现一个就计数一个,步长不是8
#7
a137803932012-11-09 16:50
回复 5楼 rjsp
输出结果不对啊,以你给出的文件举例,aaaaaaaa出现的频率为10才对(17-8+1),遇到回车往下接下才行。
#8
a137803932012-11-09 17:05
回复 5楼 rjsp
仁兄,现在就一个问题了,我刚才试了一下,我的文件1的字符串非常大,有17亿个字符,这个程序我一运行,就停止工作了,方法没有错误,就是一运行就停止。我的那个程序,专门设置了一个静态变量,所以避免了这个问题,能运行。你的这个哪里需要改一下啊?
#9
a137803932012-11-09 17:19
回复 5楼 rjsp
加个QQ吧?我把文件传给你你看一下,为什么在我这无法运行
#10
rjsp2012-11-10 08:59
以下是引用a13780393在2012-11-9 16:50:12的发言:

输出结果不对啊,以你给出的文件举例,aaaaaaaa出现的频率为10才对(17-8+1),遇到回车往下接下才行。
用你自己的程序,输出就是4
#11
rjsp2012-11-10 09:04
以下是引用a13780393在2012-11-9 17:05:12的发言:

仁兄,现在就一个问题了,我刚才试了一下,我的文件1的字符串非常大,有17亿个字符,这个程序我一运行,就停止工作了,方法没有错误,就是一运行就停止。我的那个程序,专门设置了一个静态变量,所以避免了这个问题,能运行。你的这个哪里需要改一下啊?

17亿个字符,也就是 1.6G的文件,读完需要很长时间。
而你的程序,速度那么慢,仅几十个字,我一天之内都运行不结束,我怀疑你是怎么搞定17亿个字符的?
#12
rjsp2012-11-10 13:57
以下是引用a13780393在2012-11-9 16:50:12的发言:

遇到回车往下接
帮你再改一个
程序代码:
#include <stdio.h>
#include <string.h>
#include <assert.h>

void dna8_val2str( unsigned long val, char str[8] )
{
    assert( val < (1ul<<(8*2)) );

    for( size_t i=0; i<8; ++i )
    {
        str[7-i] = "agct"[val%4];
        val >>= 2;
    }
}

int main()
{
    unsigned long words = 0;
    unsigned long numbers[65536] = { 0 };

    // 处理
    FILE* fin = fopen( "result1.txt", "r" );
    if( !fin )
        return 1;
    int bav = 0;
    unsigned long val = 0;
    for( int c; c=fgetc(fin), c!=EOF; )
    {
        if( c == '@' ) // 遇到@则结束
            break;
        if( c == '\n' )
        {
            ++words;
            continue;
        }

        val = (val<<2)&0xFFFF;
        switch( (char)c )
        {
        case 'a':  val|=0; break;
        case 'g':  val|=1; break;
        case 'c':  val|=2; break;
        case 't':  val|=3; break;
        default: // 出现了agct之外的字符
            fclose( fin );
            return 2;
        }

        if(bav<8)
            ++bav;
        else
            ++numbers[val];
    }
    fclose( fin );

    // 输出
    FILE* fout = fopen( "result2.txt", "w" );
    if( !fout )
        return 3;
    fprintf( fout, "The Number of total words are %ld\n", words );
    fprintf( fout,"The Expect Number words are %f\n", words/65536.0 );
    for( int i=0; i<65536; ++i )
    {
        if( numbers[i] !=0 )
        {
            char str[8];
            dna8_val2str( i, str );
            fprintf( fout, "%.8s\t%ld\t%f\n", str, numbers[i], numbers[i]/65536.0 );
        }
    }
    fclose( fout );

    return 0;
}

测试,result1.txt 内容如下
aaaaaaaaa
aaaaaaaag
aaaaaaaac
@

输出的 result2.txt 内容如下
The Number of total words are 3
The Expect Number words are 0.000046
aaaaaaaa    10    0.000153
aaaaaaag    1    0.000015
aaaaaaac    1    0.000015
aaaaaaga    1    0.000015
aaaaagaa    1    0.000015
aaaagaaa    1    0.000015
aaagaaaa    1    0.000015
aagaaaaa    1    0.000015
agaaaaaa    1    0.000015
gaaaaaaa    1    0.000015

#13
a137803932012-11-10 16:14
回复 10楼 rjsp
可是,我用你这个代码,运行我的大文件,只输出第一个8长度的字符,而且频数为1,剩下那65535个都没出现。
#14
a137803932012-11-10 16:16
回复 11楼 rjsp
对啊,我是从网站上下载的那个基因文件,它下载下来就有17亿个字符。我的程序已经运行四天了,还没结果。以前别人做过这个,用这个程序出结果得1周以上。时间太长,所以 我想找人优化一下
#15
a137803932012-11-10 16:22
回复 12楼 rjsp
首先非常感谢,这位仁兄的无私的奉献。我已经很感谢你了。那个输出结果不是按照,文件1的字符排列顺序输出的。输出结果应当是这样的,本来有65536(4的8次方种组合的结果)个长度为8的字符,你这个结果只给出了11个,剩下那65525个没出现的话,应当也给出来,只不过结果为数字0,但这个结果得有。
#16
rjsp2012-11-10 16:22
你用
aaaaaaaaa
aaaaaaaag
aaaaaaaac
@
作为result1.txt文件内容,且用我给的程序(用12楼给的程序吧),能得出正确结果吗?

如果不能,那就是你的编译器或运行环境有问题,因为我这儿能;如果能,那就是你的“大文件”有古怪,但我怎么获得你的这个“大文件”呢?毕竟有17亿个字符,文件大小有1.6G。
#17
a137803932012-11-10 16:27
回复 12楼 rjsp
只有本站会员才能查看附件,请 登录
让你看一下,我希望得到的结果。应该是65536个都给出来,如果哪个没出现,后面也给出结果0。有附件
#18
rjsp2012-11-10 16:33
回复 17楼 a13780393
连0都想显示出来,你只要将 if( numbers[i] !=0 ) 这一句删掉就行了呀

#19
a137803932012-11-10 16:45
回复 18楼 rjsp
给你提供一个文件,你运行一下看看。不是要按照这个文件中字符的顺序输出,而是按照aaaaaaaa、aaaaaaac、aaaaaaag等这个随机排列的顺序输出。我上个提供的结果,就是按照这样结果输出的,虽然提供的文件中第一个8字符不是aaaaaaaa。但是它输出的时候结果是aaaaaaaa 1。
#20
rjsp2012-11-10 16:47
回复 19楼 a13780393
我都听不懂你在说什么了,算了,我放弃,你爱怎么搞怎么搞
#21
a137803932012-11-10 17:00
回复 20楼 rjsp
只有本站会员才能查看附件,请 登录
#22
rjsp2012-11-12 08:54
给你提供一个文件,你运行一下看看。不是要按照这个文件中字符的顺序输出,而是按照aaaaaaaa、aaaaaaac、aaaaaaag等这个随机排列的顺序输出。我上个提供的结果,就是按照这样结果输出的,虽然提供的文件中第一个8字符不是aaaaaaaa。但是它输出的时候结果是aaaaaaaa 1。
----- 你说话很绕口,我一直都是按照排列顺序输出的,和你的要求是一致的,你认真点行不行?

1.zip
----- 我运行了,很OK。你觉得有什么问题就直说,别打哑谜
#23
rjsp2012-11-12 10:47
备注一下将 'a' 'g' 'c' 't' 转化 0 1 2 3 的一种数学方法是 %36%5
printf( "%d %d %d %d\n", 'a'%36%5, 'g'%36%5, 'c'%36%5, 't'%36%5 ); 输出为 0 1 2 3
#24
a137803932012-11-14 09:12
回复 23楼 rjsp
你的程序没有问题。我也试了,小文件能用(几千,上万吧),有结果。我的文件超过20万个字符串,你的程序就无法运行了。一点就关闭了。
#25
a137803932012-11-14 09:49
回复 22楼 rjsp
最后一个问题了,我的文件太大,1.8个G,大概17亿个字符吧。一点就关闭了。小文件的话,可以运行的,结果很好!
#26
rjsp2012-11-14 10:09
以下是引用a13780393在2012-11-14 09:49:40的发言:

最后一个问题了,我的文件太大,1.8个G,大概17亿个字符吧。一点就关闭了。小文件的话,可以运行的,结果很好!

你用的是12楼的代码吧,那代码中没有使用任何空间增长的代码,所以和文件大小应当无关
我想唯一的问题有可能是你的fgetc库可能有问题,你告诉我你使用的操作系统和编译器是什么?
另外,下午我自己生成个随机的1.8G文件测试一下
#27
rjsp2012-11-14 10:56
我用如下代码生成了一个1.8G的测试文件
程序代码:
    FILE* file = fopen( "result1.txt", "wb" );
    if( !file )
        return 1;
    for( size_t i=0; i<180000000; ++i )
    {
        fputc( "agct"[rand()%4], file );
    }
    fclose( file );
然后用12楼的代码,在15秒内就处理完这个1.8G的文件,没有出现任何错误

我的操作系统是32位windows xp
用编译器VC++2008 SP1编译运行测试通过
用编译器MinGW 4.7.2编译运行测试通过

现在我怀疑你的文件中除了a g c t @ \n之外的其他字符,你将
        default: // 出现了agct之外的字符
            fclose( fin );
            return 2;
        }
改为
        default: // 出现了agct之外的字符
            printf( "出现非法字符%c\n", (char)c );
            fclose( fin );
            return 2;
        }
试试看
#28
a137803932012-11-14 14:41
回复 27楼 rjsp
只有本站会员才能查看附件,请 登录
你运行一下,这个文件,这个是我从1.8G个文件中随机截取了一部分,无法运行。输出结果就是“出现非法字符”但是不知道是什么字符。
#29
rjsp2012-11-14 16:10
我来跟你讲讲文本格式吧
在Unix/Linux/MAC中,文本文件的行间隔用 \n
而Windows中用 \r\n
但用户是无须关心这种差别的,因为只要使用文本格式(而非二进制格式)打开文件,Unix/Linux/MAC下会将\n原样读出来写进去,而Windows会将文本中的\r\n读成\n,而将写入的\n写成\r\n。也就是,库函数本身已经做了相应的转化。
但你不能将Unix/Linux/MAC中文本格式用Windows库处理,反之亦不可,否则就是牛头对马嘴了。
而你给的这个3.txt中,文件间隔竟然用的是\r,^_^

为了适合你这个文件,我将代码改一下,你以后换文件格式时记得改代码,也就是case '\r': case '\n':那两行
程序代码:
#include <stdio.h>
#include <string.h>
#include <assert.h>

void dna8_val2str( unsigned long val, char str[8] )
{
    assert( val < (1ul<<(8*2)) );

    for( size_t i=0; i<8; ++i )
    {
        str[7-i] = "agct"[val%4];
        val >>= 2;
    }
}

int main()
{
    unsigned long words = 0;
    unsigned long numbers[65536] = { 0 };

    // 处理
    FILE* fin = fopen( "3.txt", "r" );
    if( !fin )
        return 1;
    int bav = 0;
    unsigned long val = 0;
    for( int c; c=fgetc(fin), c!=EOF; )
    {
        switch( c )
        {
        case '@': // 遇到@则结束
            break;
        case '\r':
        //case '\n':
            ++words;
            continue;
        case 'a':
        case 'g':
        case 'c':
        case 't':
            val = ((val<<2)&0xFFFF) | (c%36%5);
            if(bav<7) // 不足8个有效字符时先等等
                ++bav;
            else
                ++numbers[val];
            break;
        default: // 出现了agct之外的字符
            long pos = ftell(fin)-1;
            if( c>0x20 && c<0xFF ) // 可显示的字符,就显示其本身
                printf( "--- 0x%08lX处出现非法字符\'%c\'\n", pos, (char)c );
            else // 不可显示的字符,就显示其对应的ASCII值
                printf( "--- 0x%08lX处出现非法字符0x%02hhX\n", pos, (char)c );
        }
    }
    fclose( fin );

    // 输出
    FILE* fout = fopen( "result2.txt", "w" );
    if( !fout )
        return 3;
    fprintf( fout, "The Number of total words are %ld\n", words );
    fprintf( fout,"The Expect Number words are %f\n", words/65536.0 );
    for( int i=0; i<65536; ++i )
    {
        // if( numbers[i] !=0 )
        {
            char str[8];
            dna8_val2str( i, str );
            fprintf( fout, "%.8s\t%ld\t%f\n", str, numbers[i], numbers[i]/65536.0 );
        }
    }
    fclose( fout );
    printf( "处理完毕\n" );

    return 0;
}
另外注意一下,我用unsigned long计数,也就是数量不可以超过4亿。如果数量超过,你得改类型,还得改相应的ftell


[ 本帖最后由 rjsp 于 2012-11-15 09:02 编辑 ]
#30
a137803932012-11-14 16:52
回复 29楼 rjsp
原来如此,明白了,太感谢你了。说实话如果你现在让我给你付款我都愿意,帮了我大忙了。这个程序运行非常快,能节省我95%的时间。我的原文件有将近20亿个字符,你刚才说现在这个只能读取4亿个字符,如果要更多的话,是把哪个地方改一下?我没看明白。愿帮人帮到底,不胜感激!!!
#31
rjsp2012-11-15 09:11
uint32 能表示的最大值为 4294967295,也就是不足43亿。如果用uint64,那就可以表示一千八百亿亿,足够你用了
程序代码:
#include <stdio.h>
#include <string.h>
#include <assert.h>

void dna8_val2str( unsigned long val, char str[8] )
{
    assert( val < (1ul<<(8*2)) );

    for( size_t i=0; i<8; ++i )
    {
        str[7-i] = "agct"[val%4];
        val >>= 2;
    }
}

const char* ifilename = "result1.txt";
const char* ofilename = "result2.txt";

int main()
{
    unsigned long long words = 0;
    unsigned long long numbers[65536] = { 0 };

    // 处理
    FILE* fin = fopen( ifilename, "r" );
    if( !fin )
    {
        printf( "Cannot open \"%s'.\n", ifilename );
        return 1;
    }
    int bav = 0;
    unsigned long val = 0;
    for( int c; c=fgetc(fin), c!=EOF; )
    {
        switch( c )
        {
        case '@': // 遇到@则结束
            break;
        case '\r':
        case '\n':
            ++words;
            //bav = 0;
            continue;
        case 'a':
        case 'g':
        case 'c':
        case 't':
            val = ((val<<2)&0xFFFF) | (c%36%5);
            if(bav<7) // 不足8个有效字符时先等等
                ++bav;
            else
                ++numbers[val];
            break;
        default: // 出现了agct之外的字符
            {
            fpos_t pos;
            fgetpos( fin, &pos );
            if( c>0x20 && c<0xFF ) // 可显示的字符,就显示其本身
                printf( "--- 0x%016llX处出现非法字符\'%c\'\n", pos-1, (char)c );
            else // 不可显示的字符,就显示其对应的ASCII值
                printf( "--- 0x%016llX处出现非法字符0x%02hhX\n", pos-1, (char)c );
            }
        }
    }
    fclose( fin );

    // 输出
    FILE* fout = fopen( ofilename, "w" );
    if( !fout )
    {
        printf( "Cannot open \"%s'.\n", ofilename );
        return 3;
    }
    fprintf( fout, "The Number of total words are %lld\n", words );
    fprintf( fout,"The Expect Number words are %f\n", words/65536.0 );
    for( int i=0; i<65536; ++i )
    {
        // if( numbers[i] !=0 )
        {
            char str[8];
            dna8_val2str( i, str );
            fprintf( fout, "%.8s\t%lld\t%f\n", str, numbers[i], numbers[i]/65536.0 );
        }
    }
    fclose( fout );
    printf( "处理完毕\n" );

    return 0;
}

不过,我最大的疑惑还是10楼说的,对于
aaaaaaaaa
aaaaaaaag
aaaaaaaac
@
你一开始的代码计算出 aaaaaaaa 数目为 4
后来在7楼又说数目应该为10
其实我觉得,你一开始(为4)才是符合逻辑的,你去问问同事到底应该怎么算
#32
a137803932012-11-15 09:31
回复 31楼 rjsp
按道理是后者,等于10才对,不过数据特别大,我做的是统计,所以这点误差可以不考虑了。你最后发的这个代码我刚才运行了一下,
unsigned long long words = 0;
unsigned long long numbers[65536] = { 0 };这两行报错:e:\species\mouse\cpp2.cpp(21) : error C2632: 'long' followed by 'long' is illegal


#33
rjsp2012-11-15 10:47
行与行的数据是独立的,比如一条基因是 acgttgca,打断成 tgca、acgt,放在你的result1.txt中就是
tgca
acgt
@
如果你下一行接上一行的数据,那就成了 tgcaacgt,明显跟原先的不同

而关于编译不通过,说明你用的编译器“极度”老旧,连 long long 这个C/C++都有的内建类型都不认识
31楼的代码,只要用符合标准的编译器,无论是C,还是C++,都能编译通过,我已经试过了
C++用 VC2008 试过,也用 g++4.7.2 试过
C用 gcc4.72 试过

如果你用的是古老的VC,可以将 long long 改为 __int64,printf中格式化字符串中的ll改为I64就行了
#34
a137803932012-11-15 11:41
回复 33楼 rjsp
是这个意思,我做的是行与行之间需要首尾相接的,把所有字符归为一行进行统计。我把1.8G文件(17亿字符)分成了20份,分别输出结果,然后把数据相加。总结果和对1.8G文件整体扫描得出的结果一样。所以我觉得其实不用改数据类型了吧?
#35
a137803932012-11-27 10:16
回复 33楼 rjsp
大兄弟啊,我这有个perl的程序,比较简单,不知道你会不会,你看一下。
#!/usr/bin/perl
use strict;
use warnings;
open IN,"1.txt";
open OUT,">2.txt";
 my $dna  = <IN>;
my $revcom = $dna;
$revcom =~ tr /acgt/ACGT/;
my $gc = $revcom =~ tr/GC//;
my $gc_content = sprintf( "%.2F", $gc / length($revcom) * 100 );
my $at = $revcom =~ tr/AT//;
my $at_content = sprintf( "%.2F", $at / length($revcom) * 100 );
my $ALL = $revcom =~ tr/ACGT//;
my $A = $revcom =~ tr/A//;
my $C = $revcom =~ tr/C//;
my $G = $revcom =~ tr/G//;
my $T = $revcom =~ tr/T//;
print OUT "GC数量:$gc\n";
print  OUT "GC含量:${gc_content}%\n";
print OUT "AT数量:$at\n";
print  OUT "AT含量:${at_content}%\n";
print OUT "A总数: $A\n";
print OUT "C总数: $C\n";
print OUT "G总数: $G\n";
print OUT "T总数: $T\n";
print OUT "ACGT总数: $ALL\n";
close OUT;
close IN;
这个程序的问题,是我的数据在18亿个字符,提示信息是是超出内存(out of memmery).这个怎么修改一下啊
#36
a137803932013-01-12 20:38
回复 33楼 rjsp
兄弟,先前我是统计8个字符,这个程序很好使,我要是统计四个字符的话,把你这个程序哪个地方改一下就行了?
1