我有一个将 HTML 内容存储为二进制序列化 blob 的数据库表。我需要一一检索内容,在内容中查找某些关键字(并报告找到的匹配项),并将内容作为 HTML 文件保存到磁盘。我可以使用 Parallel.ForEach 将其并行化吗?这是一个好主意还是有更好的主意。
在此先感谢您的帮助, Ashish
我有一个将 HTML 内容存储为二进制序列化 blob 的数据库表。我需要一一检索内容,在内容中查找某些关键字(并报告找到的匹配项),并将内容作为 HTML 文件保存到磁盘。我可以使用 Parallel.ForEach 将其并行化吗?这是一个好主意还是有更好的主意。
在此先感谢您的帮助, Ashish
数据库和磁盘的 I/O 性能将比您的处理器速度慢得多,您可能看不到并行化带来的任何明显好处。
我怀疑如果您可以在一个查询中从数据库中提取一组行并并行处理每个行以查找关键字,然后一步将批处理保存回磁盘,您会看到显着的好处。如果您逐一选择并以线性方式处理它们,您将看到并行处理的好处微乎其微。
我认为你只需要尝试两种方式并衡量差异,看看它是否真的适合你。显然,在单核机器上不会有什么不同,但只处理两个文件的 8 核机器可能也看不到任何显着的好处,除非每个文件的关键字搜索需要很长时间,然后并行执行它们会再次受益。:) 我认为你最好的选择是在各种技术上尝试几个不同的尖峰,并找出最适合你和你的情况的方法。
我会做一个生产者消费者方法(http://en.wikipedia.org/wiki/Producer-consumer_problem):
一个线程查询您的数据库(如果可能,通过某种游标,以便您可以一一进行),并将每一行放在缓冲区中。
另一个线程(或者如果搜索需要非常多的处理,则可能不止一个)正在获取数据库的一行(使用您的 HTML blob)并处理搜索。
在这种情况下,您可以同时进行查询和处理。
我不相信你会因为你的查询很可能比处理时间长得多这一事实而获得很大的性能提升。问题是查询部分将磁盘读取作为瓶颈。最后,您的磁盘性能很可能会限制您的整体性能。
为了检查是否是这种方式,您可以使用多个生产者(即多个线程查询数据库)来创建生产者/消费者。
我希望它有所帮助。
爱德华多