我需要从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.