objective-c - 使用C++从文件中读取五千万个数据存入vector中如何加快速度?
PHP中文网
PHP中文网 2017-05-31 10:36:40
[iOS讨论组]

我需要从txt文件中读取五千万个double数据,并且存入vector中,我最初觉得可能是文件io太慢,所以使用了文件内存映射,将文件内容当成block全部读入内存中,然后再一个一个push_back进vector中,但是直接从文件一个一个读数据只需要3分钟,我优化之后反而增加到了5分钟。

我的优化方案是,将文件整块读入内存,放在char*的buffer中,再使用vec_name.reserve(50000000);分配五千万的容量,避免重复分配内存,但是好像没有什么作用。

难道是因为时间主要花在push_back上面了么?

请问有什么好的优化方法么?谢谢各位大神了!
优化后的关键代码如下:(需要五分钟才能将全部数据读入vector)

        
        ifstream iVecSim("input.txt");
        
        iVecSim.seekg(0, iVecSim.end);
        long long file_size = iVecSim.tellg();//文件大小
        iVecSim.seekg(0, iVecSim.beg);

        char *buffer = new char[file_size];
        iVecSim.read(buffer, file_size);

        string input(buffer);
        delete[]buffer;

        istringstream ss_sim(input);//string流

        string fVecSim;
        vec_similarity.reserve(50000000);
        while (ss_sim.good()) {//从string流中读入vector
            ss_sim >> fVecSim;
            vec_similarity.push_back(atof(fVecSim.c_str()));
        }
PHP中文网
PHP中文网

认证0级讲师

全部回复(3)
phpcn_u1582

目前最高效的办法就是用流,而在你的代码实现中可以看出来:你是全部将文件内容一次性读入buffer中,这种方式不是最好的。建议平均每次读 buffer[1024] 也就是1K,或者其他也可以。 读完指针就移到下一行,继续读,直到EOF位置结束

天蓬老师

1.如果数据间没有依赖关系的话,可以试试分块多线程读取;
2.另外vector的内存是连续的,如果后面不是要随机访问,而都是遍历的话,用list效率会高不少。

天蓬老师

可以换用C风格的scanf试试


哇怎么这么对待我答案的?举报我的网友倒是说说,这答案怎么就有问题了?

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号