【问题标题】:Parallelize the content retrieval from database, search and store as HTML并行化从数据库中检索、搜索和存储为 HTML 的内容
【发布时间】:2011-03-31 09:01:58
【问题描述】:

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

提前感谢您的帮助, 灰烬

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回复。您是否在概括(展示)您不应该平行任何涉及 IO 的事情,或者您正在谈论这个问题。你能解释一下吗?
    • 是的,一般来说,磁盘 I/O 和超级计算/并行处理不能很好地结合在一起。在某些情况下它可能有意义。例如,如果你有一个读写器问题(许多读者都想要相同的数据,可能是一个作者),那么它可能是有意义的。
    • 我不同意。如果您有大量 I/O,那么这是进行并行化的最佳时机。当一个线程正在等待 I/O 操作时,其他线程可以进行处理。它应该会有很大的改进。
    【解决方案2】:

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

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

    【讨论】:

    • Parallel.ForEach() 工作起来就像一种享受……比普通 foreach 快了近 4 倍。
    【解决方案3】:

    我会采用生产者消费者方法 (http://en.wikipedia.org/wiki/Producer-consumer_problem):

    一个线程查询你的数据库(如果可能的话,通过某种游标,这样你就可以一个一个地完成它),并将每一行放在一个缓冲区中。

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

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

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

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

    希望对你有帮助。

    爱德华多

    【讨论】:

      猜你喜欢
      • 2017-05-01
      • 2017-05-27
      • 1970-01-01
      • 2016-05-27
      • 2011-12-30
      • 1970-01-01
      • 2012-09-15
      • 1970-01-01
      • 2015-04-26
      相关资源
      最近更新 更多