| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1805 人关注过本帖
标题:利用c++分析生物信息学数据疑问
只看楼主 加入收藏
cpp_初学者
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2011-6-30
收藏
得分:0 
回复 20楼 pangding
谢谢你,pangding版主:)
可以请教你,若是用c++语言,应该如何写此程序呢?
我试着把档案该小过1GB,再做比较...
有些简单的计算,awk或许会蛮快...
但若是复杂些的计算,可能就要比较耗时 :(
我准备多些档案后,迟点再上载来,供大家讨论和分享 :)
2011-07-02 07:11
cpp_初学者
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2011-6-30
收藏
得分:0 
我主要遇到的问题,是不知该如何运用c++,来读取及分析一个档案的内容...分析后,又该如何将其储存于另一个档案 :(
用awk/sed/perl最方便的地方,或许是只需要在工作业面,输入要读取档案的名称后,利用“〉”符合,将分析结果,储存于另一个新档案...
我理想利用c++语言写好程序后的处理格式是:
程序代码:
c++程序名称 读取档案名称 结果档案名称
eg.
a.out input_file.txt output_file.txt
2011-07-02 07:32
cpp_初学者
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2011-6-30
收藏
得分:0 
若是以我提出的例子,c++的程序比awk/sed/perl慢些也没关系...
我主要是希望可以透过此例子,慢慢熟悉如何利用c++来写程序,分析数据...
谢谢...
请多指教 :)
2011-07-02 07:42
玩出来的代码
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:河南新乡
等 级:贵宾
威 望:11
帖 子:742
专家分:2989
注 册:2009-10-12
收藏
得分:1 
要求速度的话确实是c比较快,测试31M+的文件时间0.766秒左右,计算个数20808964,62M+的文件时间1.65左右。不过对于大文件的话,时间会大于线性了,文件小,我是一次读入内存的。

离恨恰如春草,更行更远还生。
2011-07-02 11:01
cpp_初学者
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2011-6-30
收藏
得分:0 
回复 24楼 玩出来的代码
你好,请问可以分享你的c++程序吗?
希望可以更熟悉c++程序,是如何处理我的案例,谢谢噢 :)
2011-07-02 11:37
玩出来的代码
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:河南新乡
等 级:贵宾
威 望:11
帖 子:742
专家分:2989
注 册:2009-10-12
收藏
得分:1 
测试文件581M,计算个数350000000。
用C写耗时8.9秒左右。内存映射文件耗时15秒左右。
用C++单存的按行读取耗时172秒。,这个也很夸张,要保证将一行的数据读完,我使用了string,而他可能会导致内存的频繁分配释放,速度肯定慢。若按照固定大小来读取那么数据处理方法与C的就一样了,差别在于I/O处理速度上。这个就没有测试了。LZ确定要用C++来处理、
你说下用你的方法处理的耗时看看。。

离恨恰如春草,更行更远还生。
2011-07-02 16:34
cpp_初学者
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2011-6-30
收藏
得分:0 
回复 26楼 玩出来的代码
你好,这是我使用的c++程序内容:
程序代码:
// aa.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>
#include <string.h>

int main(int argc, char* argv[])
{
FILE *pOpen;
char chBuf[200];
int nSum=0;
long nLen=0;
int k;
pOpen = fopen("d:\\aa.txt","r"); //打开文件

if (pOpen==NULL)
{
printf("打开文件失败");
}
else
{
//打开文件成功,读取内容
fread(chBuf,200,1,pOpen);
//开始统计
nLen = strlen(chBuf);
for(int k=0;k < nLen;k++)
{
if(chBuf[k]=='A' || chBuf[k]=='C' || chBuf[k]=='G' || chBuf[k]=='T' || chBuf[k]=='N')
{
nSum++;
}
}
fclose(pOpen);
}

printf("%d\n",nSum);

return 0;
}

以上的程序,处理小档案,没有很大问题...
但还是有些不足的地方:
1.档案的名称,必须在c++程序内列明(如:aa.txt);
2.无法把结果,显示在新的档案内;

我理想的c++程序,是希望能按照一下的格式:
程序代码:
c++程序名称 读取档案名称 结果档案名称
eg.
a.out input_file.txt output_file.txt
a.out input_file2.txt output_file2.txt

非常感谢您的意见及改写以上的c++程序 :)
2011-07-02 17:01
玩出来的代码
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:河南新乡
等 级:贵宾
威 望:11
帖 子:742
专家分:2989
注 册:2009-10-12
收藏
得分:3 
额,你这是C程序啊,不是C++。并且你这个貌似与你说的要求不一样吧,
程序代码:
int main(int argc,char **argv)
{
    FILE *pf=fopen(argv[1],"rb+");
    fseek(pf,0,SEEK_END);
    int filesize=ftell(pf);
    fseek(pf,0,SEEK_SET);

    int num=1024*1024;
    char *pbFile=new char[num+1];
    bool bFlag=false;
    int target[26]={0};
    if(pbFile==NULL)
    {
        printf("new error");
        return -1;
    }
    while(filesize>0)
    {
        if(filesize<num)
            num=filesize;
        fread(pbFile,num,1,pf);
        for(int i=0;i<num;i++)
        {
            while((i<num && pbFile[i]=='>') || bFlag)
            {
                bFlag=true;
                while(i<num && pbFile[i]!='\n')i++;
                if(i<num)
                {
                    bFlag=false;
                    i++;
                }
                else if(i==num)
                    break;
            }
            while(i<num && pbFile[i]!='\r' && pbFile[i]!='\n')
               target[pbFile[i++]-65]++;
        }
        filesize-=num;
    }
    delete []pbFile;
    fclose(pf);

    FILE *p=fopen(argv[2],"r+");
    fprintf(p,"%d",target[0]+target['G'-'A']+target['C'-'A']+target['T'-'A']);
    fclose(p);
    cout<<target[0]+target['G'-'A']+target['C'-'A']+target['T'-'A']<<endl;
    return 0;
}

给你这个参考吧,用法就和你说的一样,命令行参数。

离恨恰如春草,更行更远还生。
2011-07-02 17:47
cpp_初学者
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2011-6-30
收藏
得分:0 
回复 28楼 玩出来的代码
你好,谢谢你噢 :)
我会好好消化您所分享的c++程序...
c和c++,我也有些混淆了 :(

我在使用您的c++程序时,是否该增加"#include <stdio.h> #include <stdlib.h>"在其开头?
程序代码:
#include <stdio.h>
#include <stdlib.h>

int main(int argc,char **argv)
{
    FILE *pf=fopen(argv[1],"rb+");
    fseek(pf,0,SEEK_END);
    int filesize=ftell(pf);
    fseek(pf,0,SEEK_SET);
.
.


谢谢您的确认...
您所写的c++程序,分析数据很快 :)
2011-07-02 23:22
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:1 
像这种需求简单的位置参数用 玩出来 展示的方法就可以很好的分析出来。
不过一般需要测一测 argv 是不是大于2的,适当检查一下命令行的语法错误。

另外,楼主其实应该也感觉,这种程序就用输入输出重定向就行。让程序处理标准输入输出流是命令行程序的传统(即写成过滤器程序)。

如果对命令行分析有其它更复杂的要求,一般会用一些库来做。posix 标准要求的函数有 getopt(),你可以自己去查一查它的用法。
2011-07-03 10:05
快速回复:利用c++分析生物信息学数据疑问
数据加载中...
 
   



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

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