Microsoft/.NET堆栈中此数据迁移任务的最佳并行编程方法

Microsoft/.NET堆栈中此数据迁移任务的最佳并行编程方法,.net,sql,.net,Sql,我有SQL Server 2008数据库和两个表: 表A有列ID(int)、XmlDocument(xml) 表B有列ID(int),PdfDocument(varbinary) 我有一些.NET代码,可以将XmlDocument转换为PDF。表A中有130万行,按顺序转换所有行需要130万行@1行/秒=15天 我想在不到两个小时内完成这项工作。这个问题似乎是并行化的完美案例。我的问题是,我应该用什么来实现这一目标,以及是否有人提出了过去行之有效的好建议。我可以访问一个虚拟机实验室,并可能启

我有SQL Server 2008数据库和两个表:

  • 表A有列
    ID(int)、XmlDocument(xml
  • 表B有列
    ID(int),PdfDocument(varbinary)
我有一些.NET代码,可以将XmlDocument转换为PDF。表A中有130万行,按顺序转换所有行需要130万行@1行/秒=15天

我想在不到两个小时内完成这项工作。这个问题似乎是并行化的完美案例。我的问题是,我应该用什么来实现这一目标,以及是否有人提出了过去行之有效的好建议。我可以访问一个虚拟机实验室,并可能启动几个(5-6)虚拟机,这是一个测试数据库,我可以复制到任何地方


例如,我应该在SQL(用于并行化的service broker或SQL作业,并调用CLR proc进行转换)或.NET(我应该在多台机器上有多个进程,还是在同一台机器上有多个线程会让我非常接近)中这样做?瓶颈是什么?关于我应该使用什么策略在线程之间共享工作,有什么建议吗?

瓶颈肯定是转换过程,我一直在.NET中生成动态PDF,我的大多数2-3页的小文档可能需要几秒钟(5-8)。您不能预生成临时表并将其存储在临时表中的任何原因,所以您所要做的就是在准备就绪时通过SQL进行移动?另外,请确保生成高效(大小优化)的PDF,因为130万PDF很容易消耗大量GB的存储。

瓶颈肯定是转换过程,我一直在.NET中生成动态PDF,我的大多数2-3页的小文档很容易需要几秒钟(5-8)。您不能预生成临时表并将其存储在临时表中的任何原因,所以您所要做的就是在准备就绪时通过SQL进行移动?另外,请确保生成高效(大小优化)的PDF,因为130万PDF很容易消耗大量GB的存储空间。

有许多不同的解决方案可以解决此问题,但我会提出一些新颖的建议。使用云


假设真正的瓶颈是将Xml转换为PDF的计算能力,那么访问一个几乎无限扩展的环境可能是最快的方法。

有许多不同的解决方案可以解决这个问题,但我会提出一些新颖的建议。使用云


假设真正的瓶颈是将Xml转换为PDF的计算能力,那么访问具有几乎无限扩展的环境可能是最快的方法。

我将作为.net控制台应用程序而不是SQL类型的作业来完成这项工作,因为使用控制台程序并简单地在一组客户端上运行它要容易得多目前未使用的机器。假设文档具有某种主键,您将计算出必须运行应用程序的客户端计算机数量,然后在它们之间划分主键。如果您有四个应用程序,每个应用程序将获得大约1/4负载的密钥分割。您可以使用多种方法传递要使用的键范围,具体取决于键的外观

在应用程序本身中,您可以选择要处理的记录,然后使用并行Linq或并行foreach循环来处理该客户端的记录。这两个都是非常容易使用的并行构造,它们创建线程来完成循环中的工作,而不需要显式地处理它(框架为您处理线程)


在这一点上,只需要向它发送足够多的客户端,以便在您的时间范围内完成。

我将作为.net控制台应用程序而不是SQL类型的作业来完成这项工作,因为使用控制台程序并简单地在一堆目前未使用的客户端计算机上运行它要容易得多。假设文档具有某种主键,您将计算出必须运行应用程序的客户端计算机数量,然后在它们之间划分主键。如果您有四个应用程序,每个应用程序将获得大约1/4负载的密钥分割。您可以使用多种方法传递要使用的键范围,具体取决于键的外观

在应用程序本身中,您可以选择要处理的记录,然后使用并行Linq或并行foreach循环来处理该客户端的记录。这两个都是非常容易使用的并行构造,它们创建线程来完成循环中的工作,而不需要显式地处理它(框架为您处理线程)


在这一点上,只需向其投放足够的客户端,以便在您的时间范围内完成。

是的,我计划预生成,但我们可能需要根据QA在生成过程中是否发现错误多次预生成。是的,我计划预生成,但是,如果QA在生成过程中发现错误,我们可能需要多次预生成。