并行化从数据库中检索内容,搜索和存储为HTML

时间:2010-08-18 06:01:47

标签: c# parallel-processing threadpool task-parallel-library

我有一个数据库表,其中HTML内容存储为二进制序列化blob。我需要逐个检索内容,在内容中查找某些关键字(并报告找到的匹配项),并将内容作为HTML文件保存到磁盘。我可以使用Parallel.ForEach对此进行并行化吗?这是一个好主意还是有更好的主意。

先谢谢你的帮助, 阿希什

3 个答案:

答案 0 :(得分:1)

数据库和磁盘的I / O性能将比处理器速度慢得多,您可能不会看到并行化带来的明显好处。

答案 1 :(得分:1)

我怀疑如果你可以在一个查询中从数据库中提取一组行并并行处理每个查找关键字,然后一步将批量保存回磁盘,你就会看到显着的好处。如果您逐个选择并以线性方式处理它们,那么您将看到并行处理的最小好处。

我认为你只需要尝试两种方式并衡量差异,看看它是否真的适合你。显然,它只会对单个核心机器产生影响,但只处理两个文件的8核机器也可能看不到任何明显的好处,除非关键字搜索每个文件需要很长时间,然后并行执行它们会再次受益。 :)我认为你最好的办法是尝试各种不同的技术,并找出最适合你和你的情况。

答案 2 :(得分:0)

我会做一个Producer Consumer方法(http://en.wikipedia.org/wiki/Producer-consumer_problem):

一个线程查询您的数据库(如果可能,通过某种类型的游标,以便您可以逐个执行),并将每一行放在缓冲区中。

另一个线程(或者如果搜索需要多次处理,可能不止一个)是获取数据库的一行(使用HTML blob)并处理搜索。

在这种情况下,您可以同时进行查询和处理。

我不相信你会因为你的查询很可能比处理时间长得多而获得很大的性能提升。问题是查询部分将磁盘读数作为瓶颈。最终,您的磁盘性能很可能会限制您的整体性能。

为了检查是否是这种方式,您可以使用多个生产者(即多个查询数据库的线程)来生成生产者/消费者。

我希望它有所帮助。

爱德华