多核文本文件解析

lom*_*axx 9 c# multithreading

我有一个四核机器,并希望编写一些代码来解析利用所有四个核心的文本文件.文本文件基本上每行包含一条记录.

多线程不是我的强项,所以我想知道是否有人能给我一些我可以用来以最佳方式解析文件的模式.

我的第一个想法是将所有行读入某种队列,然后旋转线程将线从队列中拉出并处理它们,但这意味着队列必须存在于内存中,这些是相当大的文件所以我'我不是那么热衷于这个想法.

我的下一个想法是让某种控制器在一行中读取并为其分配一个线程进行解析,但是我不确定如果线程处理线路的速度超过它可能会导致控制器最终成为瓶颈阅读并分配它们.

我知道这可能是另一个比这两个更简单的解决方案,但目前我还没有看到它.

Mik*_*llo 9

我会按照你原来的想法去做.如果您担心队列可能变得太大,请为它实现一个缓冲区(即,如果超过100行,则停止读取文件,如果它低于20,则再次开始读取.您需要进行一些测试找到最佳障碍).使它成为任何线程都可能是"读者线程",因为它必须锁定队列以拉出项目,无论如何它还可以检查"低缓冲区域"是否已被命中并再次开始读取.在执行此操作时,其他线程可以读出队列的其余部分.

或者如果您愿意,让一个读者线程将线路分配给其他三个处理器线程(通过他们自己的队列)并实施工作窃取策略.我从来没有这样做过,所以我不知道它有多难.


Der*_*ark 9

Mark的答案是更简单,更优雅的解决方案.如果没有必要,为什么要使用线程间通信来构建复杂的程序?产生4个线程.每个线程计算文件大小/ 4以确定它的起点(和停止点).然后,每个线程可以完全独立工作.

添加特殊线程来处理读取的唯一原因是,如果您希望某些行需要花费很长时间来处理,并且您希望这些行聚集在文件的单个部分中.当您不需要它时添加线程间通信是一个非常糟糕的主意.您极大地增加了引入意外瓶颈和/或同步错误的可能性.