微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在缓冲中逐行读取大量文本文件

我需要从C盘中逐行读取巨大的35G文件.目前我以如下方式做:
ifstream infile("myfile.txt");
string line;
while (true) {
    if (!getline(infile,line)) break;
    long linepos = infile.tellg();
    process(line,linepos);
}

但是它给我大约2MB /秒的性能,尽管文件管理器以100Mb / s的速度复制文件.我猜getline()没有正确地进行缓冲.请提出一些缓冲的逐行阅读方法.

UPD:process()不是瓶颈,没有process()的代码以相同的速度工作.

解决方法

使用标准的IO流,您将无法接近线速度.缓冲与否,几乎任何解析都将以数量级的速度杀死你的速度.我对由两个int和一个双线(Ivy Bridge chip,SSD)组成的数据文件进行了实验:

> IO流以各种组合:〜10 MB / s.纯粹的解析(f>> i1> i2> d)比在一个字符串中的getline更快,后跟一个sstringstream解析.
>像fscanf这样的C文件操作得到约40 MB / s.
没有解析的getline:180 MB / s.
> fread:500-800 MB / s(取决于文件是否被操作系统缓存).

I / O不是瓶颈,解析是.换句话说,你的进程可能是你的慢点.

所以我写了一个并行解析器.它由任务组成(使用TBB管道):

>发现大块(一次一个这样的任务)
>重新布置块,使得一条线不在块之间分割(一次一个这样的任务)
>解析块(许多这样的任务)

我可以有无限的解析任务,因为我的数据无序.如果你不是,那么这可能不值得你.这种方法让我在一个4核IvyBridge芯片上大约100 MB / s.

原文地址:https://www.jb51.cc/c/115926.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐