使用多个内核在c ++中处理大型顺序文件

Pio*_*otr 10 c++ multithreading multicore tbb

我有一个大文件(比RAM大,不能一次读取整个),我需要逐行处理它(在c ++中).我想利用多个内核,最好使用Intel TBB或Microsoft PPL.我宁愿避免预处理这个文件(比如把它分成4个部分等).

我正在考虑使用4个迭代器,在文件中初始化为(0,n/4,2*n/4 3*n/4)位置等.

这是一个很好的解决方案,有没有简单的方法来实现它?

或者您可能知道一些支持高效,并发读取流的库?

更新:

我做了测试.IO不是瓶颈,CPU是.我有很多缓冲区的RAM.

我需要解析记录(var大小,每个大约2000个字节,记录由唯一的'\ 0'char分隔),验证它,做一些计算,并将结果写入另一个文件

Soa*_*Box 14

由于您可以将其拆分为多个N部分,因此听起来每行的处理在很大程度上是独立的.在这种情况下,我认为最简单的解决方案是设置一个线程来逐行读取文件并将每一行放入一个tbb::concurrent_queue.然后生成尽可能多的线程,从队列中拉出行并处理它们.

此解决方案与文件大小无关,如果您发现需要更多(或更少)工作线程,则可以轻松更改数量.但是如果行之间存在某种依赖关系,这将无法工作......除非你设置第二个"后处理"线程轮询来处理它,但事情可能会开始变得过于复杂.

  • +1,顺序读取对于磁盘和内存更好. (3认同)

Ale*_*nov 6

我的建议是使用TBB的管道模式.管道的第一个串行阶段从文件中读取所需的数据部分; 后续阶段并行处理数据块,最后一阶段写入另一个文件,可能与读取数据的顺序相同.

TBB分布中提供了此方法的示例; 见例子/管道/广场.它使用"旧"接口,类tbb::pipeline和过滤器(继承自的类tbb::filter)通过void*指针传递数据.更新,类型安全和lambda友好的"声明"界面tbb::parallel_pipeline()可能更方便使用.