我有一个超过500000个网址的文件。现在我想读取文件,并用我的函数解析每个url,它返回字符串消息。现在一切正常,但是性能不是很好,所以我需要在模拟线程(例如100个线程)中开始解析。
ParseEngine parseEngine = new ParserEngine(parseFormulas);
StreamReader reader = new StreamReader("urls.txt");
String line = string.Empty;
while ((line = reader.ReadLine()) != null)
{
    string result = parseEngine.Parse(line);
    Console.WriteLine(result);
}
reader.Close();这将是很好的,当我可以停止所有线程的按钮点击和改变线程的数量。有什么帮助和建议吗?
发布于 2011-03-29 03:48:35
请务必将this article on PLINQ performance与使用多线程逐行解析文本文件的其他技术进行比较。
它不仅提供了执行几乎与您想要的完全相同的操作的示例源代码,而且还发现了PLINQ的“陷阱”,这可能会导致异常缓慢的时间。简而言之,如果您尝试使用File.ReadAllLines()或StreamReader.ReadLine(),您将破坏性能,因为PLINQ不能以这种方式正确地划分文件。他们通过将所有行读取到一个索引数组中,然后用PLINQ进行处理来解决这个问题。
发布于 2011-03-29 03:39:50
老实说,对于性能差异,如果可以的话,我会在.net 4.0中尝试并行foreach。
 using System.Threading.Tasks;
  Parallel.ForEach(enumerableList, p =>{   
             parseEngine.Parse(p);   
     });这是并行运行的一个很好的开始,应该可以最大限度地减少线程的疑难问题。
发布于 2011-03-29 03:47:21
生产者/消费者设置会对此很有帮助。一个线程从文件中读取并写入队列,其他线程可以从队列中读取。
你提到的100个线程的例子.如果你有这么多的线程,你可能想成批地从队列中读取,因为在读取之前你可能必须锁定队列,因为一个队列只对单个reader+writer是线程安全的。
我认为4.0中有一个新的ConcurrentQueue通用,但我不能确定。
你真的只想要一个文件的读取器。
https://stackoverflow.com/questions/5464103
复制相似问题