| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2146 人关注过本帖
标题:求优化下程序,这个程序能用,就是运行太慢,求优化下能加快速度
只看楼主 加入收藏
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
以下是引用a13780393在2012-11-9 17:05:12的发言:

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

17亿个字符,也就是 1.6G的文件,读完需要很长时间。
而你的程序,速度那么慢,仅几十个字,我一天之内都运行不结束,我怀疑你是怎么搞定17亿个字符的?
2012-11-10 09:04
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
以下是引用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

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

如果不能,那就是你的编译器或运行环境有问题,因为我这儿能;如果能,那就是你的“大文件”有古怪,但我怎么获得你的这个“大文件”呢?毕竟有17亿个字符,文件大小有1.6G。
2012-11-10 16:22
a13780393
Rank: 1
等 级:新手上路
帖 子:45
专家分:0
注 册:2012-10-6
收藏
得分:0 
回复 12楼 rjsp
Y.zip (409.87 KB)
让你看一下,我希望得到的结果。应该是65536个都给出来,如果哪个没出现,后面也给出结果0。有附件
2012-11-10 16:27
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
回复 17楼 a13780393
连0都想显示出来,你只要将 if( numbers[i] !=0 ) 这一句删掉就行了呀

2012-11-10 16:33
a13780393
Rank: 1
等 级:新手上路
帖 子:45
专家分:0
注 册:2012-10-6
收藏
得分:0 
回复 18楼 rjsp
给你提供一个文件,你运行一下看看。不是要按照这个文件中字符的顺序输出,而是按照aaaaaaaa、aaaaaaac、aaaaaaag等这个随机排列的顺序输出。我上个提供的结果,就是按照这样结果输出的,虽然提供的文件中第一个8字符不是aaaaaaaa。但是它输出的时候结果是aaaaaaaa 1。
2012-11-10 16:45
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
回复 19楼 a13780393
我都听不懂你在说什么了,算了,我放弃,你爱怎么搞怎么搞
2012-11-10 16:47
快速回复:求优化下程序,这个程序能用,就是运行太慢,求优化下能加快速度
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.036411 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved