首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >c#多线程文件读取和页面解析

c#多线程文件读取和页面解析
EN

Stack Overflow用户
提问于 2011-03-29 03:35:10
回答 4查看 2.3K关注 0票数 1

我有一个超过500000个网址的文件。现在我想读取文件,并用我的函数解析每个url,它返回字符串消息。现在一切正常,但是性能不是很好,所以我需要在模拟线程(例如100个线程)中开始解析。

代码语言:javascript
运行
复制
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();

这将是很好的,当我可以停止所有线程的按钮点击和改变线程的数量。有什么帮助和建议吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-03-29 03:48:35

请务必将this article on PLINQ performance与使用多线程逐行解析文本文件的其他技术进行比较。

它不仅提供了执行几乎与您想要的完全相同的操作的示例源代码,而且还发现了PLINQ的“陷阱”,这可能会导致异常缓慢的时间。简而言之,如果您尝试使用File.ReadAllLines()或StreamReader.ReadLine(),您将破坏性能,因为PLINQ不能以这种方式正确地划分文件。他们通过将所有行读取到一个索引数组中,然后用PLINQ进行处理来解决这个问题。

票数 2
EN

Stack Overflow用户

发布于 2011-03-29 03:39:50

老实说,对于性能差异,如果可以的话,我会在.net 4.0中尝试并行foreach。

代码语言:javascript
运行
复制
 using System.Threading.Tasks;

  Parallel.ForEach(enumerableList, p =>{   
             parseEngine.Parse(p);   
     });

这是并行运行的一个很好的开始,应该可以最大限度地减少线程的疑难问题。

票数 1
EN

Stack Overflow用户

发布于 2011-03-29 03:47:21

生产者/消费者设置会对此很有帮助。一个线程从文件中读取并写入队列,其他线程可以从队列中读取。

你提到的100个线程的例子.如果你有这么多的线程,你可能想成批地从队列中读取,因为在读取之前你可能必须锁定队列,因为一个队列只对单个reader+writer是线程安全的。

我认为4.0中有一个新的ConcurrentQueue通用,但我不能确定。

你真的只想要一个文件的读取器。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5464103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档