1

我在数据库表中有一百万行。对于每一行,我必须运行一个自定义 exe,解析输出并更新另一个数据库表

如何并行运行多行进程?

我现在有一个简单的数据流任务->GetData->Run Script (Run Process, Parse Output)->Store Data For 6000 rows 它花了 3 个小时。太多了。

4

2 回答 2

3

这里有一个瓶颈,每行运行进程。增加“EngineThreads”根本没有帮助,因为无论如何只有一个线程运行这个特定的脚本转换。花在其他转换上的时间可能根本不重要。进程是重量级的对象,运行数千个进程永远不会便宜。

我可以想到以下想法以使其变得更好:

1)修复它的最佳方法是将您的自定义 EXE 转换为程序集并从脚本转换中调用它 - 以避免创建进程、解析输出等的开销。

2)如果必须使用单独的进程,可以尝试并行运行这些进程。如果进程主要等待一些输入/输出(即它是 I/O 绑定的),这将有所帮助。如果进程受内存限制或 CPU 限制,则并行运行它们不会带来太多好处。

2A) 复杂的脚本,简单的封装。

要并行运行它们,请修改脚本中的 ProcessInput 方法以异步启动流程,并且不要等待流程完成 - 移动到下一行并创建下一个流程。订阅流程输出和流程退出事件,以便您知道它何时完成。限制并行运行的进程数量 - 否则您将耗尽内存。等到所有进程完成后再从 ProcessInput 调用返回。

2B) 简单的脚本,复杂的包。

保留当前的顺序脚本,但使用 SSIS 对数据进行分区。添加条件拆分转换,并根据一些哈希表达式将输入流拆分为多个流 - 这将使每个输出接收大约相同数量的数据。流的数量等于您要并行运行的流程实例的数量。将您的脚本转换添加到条件拆分的每个输出中。现在您还应该增加“引擎线程”属性:) 并且这些转换将并行运行。(注意:根据标签,我假设您使用 SSIS 2008。您需要插入额外的 Union All 转换以使其在 SSIS 2005 中工作)。

这应该可以使其性能更好,但是数百万个进程很多。你在这里很难得到很好的表现。

于 2009-01-06T08:37:30.160 回答
1

如果您使用“数据流”容器执行此过程,则其上有一个名为“EngineThreads”的属性,默认值为 5。您可以将其设置为更高的数字,例如 20,这将投入更多线程处理这些行。

这只是一个性能调整或优化,如果您的 ssis 包仍然运行缓慢,那么我可能会解决您的包的体系结构和设计。

于 2009-01-06T04:35:49.230 回答