回 帖 发 新 帖 刷新版面

主题:求问如何加快从文件读取大量数据到数组的速度

代码如下,查找和排序的头文件我没加进来,一般运行要7秒,测试了下,把每行数据写进数组就要6.5秒,主要是那个for循环耗时,求问如何改进! 


[code=c]
#include<ctime> 
#include<iostream> 
#include<fstream> 
#include"qck.h" 
#include"binarysearch.h" 
using namespace std; 

int main() 

    char filename[20]; 
    cout<<"请输入文件名:"; 
    cin>>filename; 
    ifstream infile(filename,ios::in); 
    if(!infile) 
    { 
        cerr<<"open error!"<<endl; 
        exit(1); 
    } 

    clock_t start,finish;//声明开始结束变量 
           start=clock();//开始计算时间 

    char x[8]; 
    infile.getline(x,8,'\n'); 
    int *b; 
    b=new int[sizeof(int)*1000000]; 
    int i; 
    for(i=0;i<1000000;i++) 
    {    
        infile.getline(x,8,'\n'); 
        b=atoi(x); 
    }     
qck(b,1000000); 
    cout<<"top 3:"<<endl; 
    for(i=0;i<3;i++) 
        cout<<b<<endl; 
    cout<<endl; 
    cout<<"last 3:"<<endl; 
    for(i=999997;i<1000000;i++) 
        cout<<b<<endl; 
    cout<<endl; 

    int num; 
    num=binarysearch(b,1000000,856509); 
    cout<<"index of 856509:"<<num<<endl; 

    cout<<"data of index 223731:"<<b[223730]<<endl; 

    finish=clock();//结束计算时间 
           cout<<endl<<"程序所用时间:"<<(double)(finish-start)/CLK_TCK<<"s"<<endl;//输出时间 

    return 0; 
} [/code]

回复列表 (共4个回复)

沙发

那个,cin和cout怎么加快速度这个我不清楚。

不过我知道如果改成scanf和printf,速度的提升会让你眼前一亮。

确切的说,就是把C++的流改成C的文件读取方式(不过吧,代码写起来不是那么好看)

板凳

每次读一行,放vector里,直到全部读完,然后一次性转换成整数,放入另外一个vector,最后再检索。

3 楼

楼主已经是每次读一行了。。。
建议楼主这样吧:
按块读取,然后自行解析。
把块设置为32K——这是一般情况下操作系统使用的最大的簇。

4 楼

[quote]楼主已经是每次读一行了。。。
建议楼主这样吧:
按块读取,然后自行解析。
把块设置为32K——这是一般情况下操作系统使用的最大的簇。[/quote]

每行才8个字符啊?谁写文件能这么组织啊?晕倒。为何一行不多存些值?或者干脆用二进制文件!

如果文件内容和组织形式无法改,那把整个文件读入到一个string,然后解析。

我来回复

您尚未登录,请登录后再回复。点此登录或注册