c# - 多核文本文件解析

标签 c# multithreading

我有一台四核机器,想编写一些代码来解析一个文本文件,以利用所有四核。文本文件基本上每行包含一条记录。

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

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

我的下一个想法是拥有某种 Controller ,它将读取一行并为其分配一个线程来解析,但我不确定如果线程处理行的速度更快, Controller 是否最终会成为瓶颈比它可以读取和分配它们。

我知道可能还有比这两种更简单的解决方案,但目前我还没有看到。

最佳答案

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

或者,如果您愿意,可以让一个读取器线程将这些行分配给其他三个处理器 线程(通过它们自己的队列)并实现 work-stealing strategy .我从来没有这样做过,所以我不知道这有多难。

关于c# - 多核文本文件解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7015/

相关文章:

c# - TcpListener 排队连接的速度快于我清除它们的速度

c++ - 为什么在调用 std::call_once() 时需要这个指针?

ruby-on-rails - Ruby 线程池——我做错了什么?

c# - 如何在 MonoDevelop/Visual Studio 中跳过加载项目

C# 将 List<ushort> 转换为 List<short>

C# 随机生成

c# - 如何更新多个部分 View (一个主网格和另一个总计网格)?

c# - 是否可以始终使用 Task 强制一个新线程?

java - 线程卡在更新语句: cancelling or closing the statement,中并且中断线程不起作用

c - 区分pthread调用的线程