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

在缓冲中逐行读取大量文本文件,第1张

概述我需要从C盘中逐行读取巨大的35G文件.目前我以如下方式做: ifstream infile("myfile.txt");string line;while (true) { if (!getline(infile, line)) break; long linepos = infile.tellg(); process(line,linepos);} 但是它给我大约 我需要从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://54852.com/langs/1234173.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存