我有一个简单的任务,很容易并行。基本上,必须在(大,几个Gb)输入文件的每一行上重复执行相同的操作。虽然我已经做了一个多线程版本,但我注意到我的I/O是瓶颈。我决定构建一个实用程序类,它涉及一个简单的“文件读取器”线程,它可以直接向前读取并尽可能快地读入循环缓冲区。然后,多个消费者可以打电话给这个班级并获得他们的“下一行”。给定n个线程,每个线程我的起始行是文件中的第i行,并且通过添加n找到该线程的每个后续行。事实证明,这不需要锁,几个关键的原子操作就足以保存不变量。单文件阅读器/多用户模型:多线程程序的好主意?
我测试了代码,它似乎更快,但经过第二次思考,我不知道为什么。将大文件分割成n个输入文件(你可以'前进'到同一个文件中以达到同样的效果,最少的预处理),然后让每个进程只需调用iostream :: readLine就可以了它自己的块? (因为iostream也读入它自己的缓冲区)。在多线程之间共享单个缓冲区似乎没有任何固有的优势,因为工作人员实际上并不在相同的数据线上运行。另外,没有什么好方法我不认为要并行化,以便它们在同一行上工作。我只是想了解我看到的性能增益,并知道它是'flukey'还是跨平台可扩展/可重复的...
除顺序文件读取之外的任何其他操作都会造成更多的伤害,尤其是对于需要实际的机械磁盘操作来“真正”读取不在磁盘/驱动器缓存中的数据的大型文件。我不太确定你的单个循环缓冲区设计。单个文本行的线程间通信不会很有效 - 太多的原子操作和读取线程在解析行时应该填充缓冲区。我可能会带着一个更大的缓冲区实例池。 –