| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1134 人关注过本帖, 1 人收藏
标题:程序运行缓慢,望赐教改进!!!
取消只看楼主 加入收藏
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
结帖率:93.94%
收藏(1)
已结贴  问题点数:40 回复次数:10 
程序运行缓慢,望赐教改进!!!
程序本身没错,但运行缓慢,十来天不出结果,乞求改进!!
勿吝赐教!!!谢谢!!!


#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#include"math.h"
#define N 65536             //计算八联体
struct motif
{
  char name[20];
  int  number;
} lead[N];          //结构体数组更清晰,因为每一种三联体组合包括字符串组成形式和出现次数两个内容
void main()               //之所以void,因为不需要向屏幕上输出任何东西
{
int i,j,m,n,x,y,u,v,h=0,pw[2001]={0};          //pw[2001]用来统计出现次数相同的三联体个数
char ch[4]={'A','T','C','G'};
static char str[95000000];
float bili[2001]={0.0};
FILE *in,*out;
in=fopen("F:\\24条染色体结果\\结果1.txt","r");        //第12行
out=fopen("F:\\结果文件\\收获1.txt","w");
for(i=0;i<4;i++)             //统计所有的三联体组合情况
 for(j=0;j<4;j++)
  for(m=0;m<4;m++)
   for(n=0;n<4;n++)
    for(x=0;x<4;x++)
     for(y=0;y<4;y++)
      for(u=0;u<4;u++)
       for(v=0;v<4;v++)
       {
            lead[h].name[0]=ch[i];
            lead[h].name[1]=ch[j];
            lead[h].name[2]=ch[m];
            lead[h].name[3]=ch[n];
            lead[h].name[4]=ch[x];
            lead[h].name[5]=ch[y];
            lead[h].name[6]=ch[u];
            lead[h].name[7]=ch[v];
            h++;
  }      
for(h=0;h<N;h++)
lead[h].number=0;
while(!feof(in))      //feof()用来测试文件是否结束,如果结束则返回值1,未结束返回0;很明显文件未结束程序才运行,故加上个!来让while里值为真
{
fgets(str,95000000,in);
for(i=0;i<95000000;i++)                      //以下四行用来判断str中各个三联体出现次数
 for(h=0;h<N;h++)
   if(lead[h].name[0]==str[i]&&lead[h].name[1]==str[i+1]&&lead[h].name[2]==str[i+2]&&lead[h].name[3]==str[i+3]
     &&lead[h].name[4]==str[i+4]&&lead[h].name[5]==str[i+5]&&lead[h].name[6]==str[i+6]&&lead[h].name[7]==str[i+7])
   lead[h].number++;
}
for(h=0;h<N;h++)
fprintf(out,"%d\t%s\t%d\n",h,lead[h].name,lead[h].number);
for(i=0;i<=2000;i++)               
{
for(h=0;h<N;h++)
if(i==lead[h].number)
pw[i]+=1;                      //计算出出现了j次的组合的个数
bili[i]=(float)pw[i]/N;             //计算所占比例
fprintf(out,"%d\t%4d\t%f\n",i,pw[i],bili[i]);
}
fclose(out);
}
搜索更多相关主题的帖子: 三联体 include number 结构体 
2013-03-12 17:41
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
以下是引用azzbcc在2013-3-12 17:46:14的发言:

首先问下你要达到什么目的,目测循环嵌套太多应该是主要问题,所以也许可以优化算法
 
其次小声明下,你输出不输出,和主函数的返回类型没关吧
结果22.rar (4.31 MB)
      这里是有将近几千万个碱基(碱基即A或T或C或G),比如说现在我要找到比如说 ATATCGGA 这个字符串在几千万个长的碱基序列里出现了多少次  ,当然像 ATATCGGA 这样的组合共有4的8次幂个,因为8个位置每个位置都有四个选择(或A或T或C或G),这样我要找出这4的8次幂个组合每一个在这段极长序列中出现多少次,所以工作量较大!!!
       希望指教       运行太耗时了     想简化但能力有限      望赐教!!!!
2013-03-12 18:05
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
以下是引用beyondyf在2013-3-12 18:59:33的发言:

我对你这个应用相关的生物学知识更感兴趣。愿意的话我可以帮你,但需要更详细的需求描述,毕竟我不懂你的专业。

不如先回答我几个问题
1.基因片段的匹配可以重叠吗?
  比如ABAB这个片段在ABABABAB这个串里的统计次数是2次还是3次。

2.你要匹配的子串是固定的8个(最好说说为什么,我很好奇,即使可能听不懂但还是想知道呵呵)还是有可能是任意数量的?

3.详细描述一下输入数据和输出数据的格式。
您好     1:是3次
        2:不是非要是8个,可以使任意个数的;比如说 ATCGTACA 在生物学里叫做八模体,而这样的八模体有4的8次幂个;如果只有6个碱基  ATACTC,那就是六模体,共有4的6次幂个;十模体、二十模体等都是可以的。
         3:我要读的文件中的内容是有几千万个碱基构成的字符串
            我要输出的内容是每一种八模体在这段极长的碱基字符串上共出现多少次,这样得到4的8次幂个数据;
            然后再统计出出现相同次数的八模体一共又有多少个,比如说都出现一次的有多少个八模体,都出现100次的有多少个八模体等等..
2013-03-12 19:13
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
以下是引用zklhp在2013-3-12 19:18:05的发言:

生物信息学罢

如果数据是类似 ACCGACGTCGGT 这样的ASCII 一次读4的倍数个 读到一个int里面 比较数 是不是能快一点呢

我看的文献都是用专门的统计分析包做这种东西 比如R做癌症基因表达神马的 不知道你们的方向有没有这种软件 自己写还是麻烦啊

祝楼主好运
您好    是有关生物信息学的东西,但没有什么软件,只能自己编写,望赐教!!!!
2013-03-12 19:20
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
以下是引用beyondyf在2013-3-12 18:59:33的发言:

我对你这个应用相关的生物学知识更感兴趣。愿意的话我可以帮你,但需要更详细的需求描述,毕竟我不懂你的专业。

不如先回答我几个问题
1.基因片段的匹配可以重叠吗?
  比如ABAB这个片段在ABABABAB这个串里的统计次数是2次还是3次。

2.你要匹配的子串是固定的8个(最好说说为什么,我很好奇,即使可能听不懂但还是想知道呵呵)还是有可能是任意数量的?

3.详细描述一下输入数据和输出数据的格式。
您好    第一个问题里   基因片段可以重叠    也就是读到3个。
2013-03-12 19:25
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
以下是引用beyondyf在2013-3-12 19:59:49的发言:

呵呵,问题清晰了很多。再明确一下,其实关于N模体(到底是“模体”还是“联体”)的每一种出现的次数并不是你想要的,它只是个中间值,你最终想要的是在一个指定的长序列里出现K次的N模体有多少(需要知道具体是哪些吗?)。对不对?

请详细的回答我,我想我可以帮到你。至少你那个在几千万的序列里分析8模体的要求,我可以在几秒钟内完成统计并输出你想要的结果。

还有,详细的描述一下输入输出文件格式。输入文件的开头有什么数据说明之类的文件头吗?还是直接就是碱基序列的开始?序列以什么结尾?一个文件只包含一个序列还是多个序列?如果是多个序列,它们是如何区分的?输出文件里具体是什么?等等吧,越详细越好。

或者举个简明的例子也好,比如关于一个十几位长的序列的输入输出。你那个文件我下载了,开头那一堆N是干什么的我就不知道。
您好   首先要非常感谢你,因为我现在既需要统计八模体,也需要统计六模体,很可能十模体也是要的,我编的那个运行太慢,没法做工作,谢谢!!!

   是N模体,生物学里的一个术语。您说的对,因为我只有知道了每一种模体出现的次数,我才能进一步统计出出现相同次数的八模体(或其他N模体)有多少个,所以那的确是个中间值。
    读入文件就是我上传的文件,我们要用fopen()从这个文件里读取极长的碱基字符串,当然这个文件里从第一个碱基字母开始就是我们要查找每种八模体出现次数的极长字符串,当然开头的那一堆N指的是未知碱基,也就是不能具体确定它是A、T、C、G四个碱基的哪一个,所以检测八模体出现次数时那一堆N可以不计入查找范围。
     我上传的文件里包含的内容就把它看成是一个由几千万个碱基构成的序列,就是一个序列,当然您下载后也许会看到它们是几十个一行几十个一行对吧,但分行并不表示开始下一个序列,全部的碱基看成一个序列,也就相当于一个字符串。
      输出文件里是这样     每种八模体形式及其对应的出现次数;另外就是出现相同次数的八模体个数,当然列出的应是出现次数分别为0,1,2.....1999,2000,同时与其对应的八模体个数。
   
2013-03-12 20:28
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
回复 11楼 beyondyf
您好,没错,因为我是搞基因序列的,所以需要大量编程,这C语言也是后期自学的,不精。
A、T、C、G没有固定的排列顺序,在八模体中每个位置的碱基选择都是任意的。
您理解的输出格式是对的,就那样就很好。只是我的理解的话,您说的数据间的空格,应该是用制表符完成的吧,不是用
fprintf(fp,"%s\t%d\n",  ,      )这样完成把数据输出到txt文件里吧!
2013-03-12 21:32
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
以下是引用beyondyf在2013-3-12 21:22:31的发言:

对了,还忘了一个问题,你的输入数据中,N会不会出现在序列的中间?如果会,你希望怎么处理。

尽快回复,今天协商妥了这些问题,明天你就能看到你等了十几天的统计数据了。

初步,我打算把你的N模体,N限制在10以内。至于二十模体,呵呵,输出文件得有几十个T大,你的内存和硬盘都吃不消的。
N不会在序列的中间,这个未知碱基只会出现在碱基序列的最前端,中间是不会出现的!!!
     N限制在10以内就行,因为我通常分析较多的是N等于4、6、8、10的N模体情况,我估计10模体得到的结果也很大吧!!
再次谢谢您,帮了我这么大的忙!!!!!!
2013-03-12 21:37
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
回复 15楼 beyondyf
好的,谢谢!
2013-03-12 21:46
zhou31146001
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:303
专家分:131
注 册:2012-11-28
收藏
得分:0 
谢谢您,非常感谢!!!!!
以后多多指教!
2013-03-13 16:57
快速回复:程序运行缓慢,望赐教改进!!!
数据加载中...
 
   



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

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