如何使用c#和并行扩展并行化顺序任务?

如何使用c#和并行扩展并行化顺序任务?,c#,parsing,parallel-processing,task-parallel-library,parallel-extensions,C#,Parsing,Parallel Processing,Task Parallel Library,Parallel Extensions,我有以下按顺序调用的方法: 私有StringBuilder ReadPDF() 私有StringBuilder CleanText(StringBuilder sb) 私有void ParseText() ParseText调用ReadPDF,ReadPDF调用CleanText 我正在解析的PDF有15MB的文本,使用常规core 2 duo计算机从文件中提取所有数据需要10分钟 如何将这些任务并行化 编辑:只是澄清一下,阅读PDF只需要很少的时间,问题在于解析提取的文本,更具体地说是在Cle

我有以下按顺序调用的方法:

  • 私有StringBuilder ReadPDF()
  • 私有StringBuilder CleanText(StringBuilder sb)
  • 私有void ParseText() ParseText调用ReadPDF,ReadPDF调用CleanText

    我正在解析的PDF有15MB的文本,使用常规core 2 duo计算机从文件中提取所有数据需要10分钟

    如何将这些任务并行化


    编辑:只是澄清一下,阅读PDF只需要很少的时间,问题在于解析提取的文本,更具体地说是在CleanText阶段。我需要并行化的原因是,清理单个页面是即时的,但清理2k+页面需要很长时间。

    首先,您可能需要查看阅读PDF的方式。如果它只有15MB,那么读取它不会花费10分钟,除非您使用了非常糟糕的解析方法。
    其次,在找到更好的解析方法之后,您应该确保可以从所需的任何页面一次读取一个页面。此后,您将能够并行执行阅读单个页面的多个任务。

    正如Denis所说,您可以阅读文本的一部分,通常是一页,但您可以将其分成更小的块,然后在阅读下一部分文本时处理该文本

    如果你想了解更多关于并行编程的知识,你可以在网站上找到好的信息和实验室

    MDN也有一个功能


    还有一本好书《C#的专业并行编程:Gastón Hillar的.NET 4主并行扩展》

    一页一页地阅读PDF,并使用流水线处理每一页


    正如之前在一篇帖子中提到的,可能你做错了什么。它只有15MB的PDF,阅读它不需要10分钟。

    阅读PDF不需要10分钟,通常每2k页需要10秒钟,因为我阅读它们时保留了文档结构。清理文本需要14分钟。@anthony,清理文本是做什么的?它需要这么长时间?再一次,我想不出任何一个过程会花费这么长的时间,即使它对文本进行“视频”处理,实际上这是我的错误。我要通读全文,找到一个匹配项,并对我需要的每一个匹配项重复这个过程。因为文本很难解析(没有模式),所以花了这么长时间。我听从了你的建议,对单个页面的并行解析将解析时间从10+分钟缩短到6秒。对不起,我应该说读取PDF很快,问题是如何清理它以便提取所需的数据。哇,流水线正是我所追求的:使用其他任务的输出生成最终结果的任务,对吧@安东尼:除非你在做一些严肃的黑魔法分析,否则清理15兆字节的数据应该不会花费任何时间来获得合理高效的代码。在没有看到一些示例代码的情况下,很难说时间会花在哪里,但最好看看字符串处理。几乎每个字符串操作都会在内存中创建一个全新的字符串,因此,如果您处理大量文本,则很容易浪费大量时间来执行诸如连续调用string.Replace()之类的操作。我会尽可能使用StrinBuilder来限制创建的新字符串。下面是我用来清理文本的代码的简化版本:您使用StringBuilder的方式可能使问题变得更糟而不是更好。您对sb.ToString()的每次调用都将创建所有文本的全新副本。更好的模式的一个例子是将输入分解为更小的单元,您可以将其作为IEnuemrable返回,然后创建一组更小的过程,使用枚举器块连续删除不需要的文本(通过简单地不
    生成返回
    并将其转换为数据流)。