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

前端之家收集整理的这篇文章主要介绍了在缓冲中逐行读取大量文本文件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要从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.

猜你在找的C&C++相关文章