SSIS 处理大量平面文件非常缓慢
Posted
技术标签:
【中文标题】SSIS 处理大量平面文件非常缓慢【英文标题】:SSIS processing large amount of flat files is painfully slow 【发布时间】:2013-06-13 13:08:28 【问题描述】:从我们的一位合作伙伴那里,我收到了大约 10.000 个小制表符分隔的文本文件,每个文件中包含 +/- 30 条记录。他们不可能把它放在一个大文件中。
我在 ForEach 循环容器中处理这些文件。读取文件后,执行 4 列推导,最后将内容存储在 SQL Server 2012 表中。
此过程最多可能需要两个小时。
我已经尝试将小文件处理成一个大文件,然后将这个文件导入同一个表中。这个过程需要更多时间。
有人对加快处理速度有什么建议吗?
【问题讨论】:
你的包看起来像一个 Foreach 循环。在 Foreach 循环中,您有一个数据流任务。数据流任务有一个平面文件源。派生列转换连接到平面文件源。然后,您有一个(OLE DB 目标或 SQL Server 目标)附加到派生列转换?如果您使用的是 OLE DB 目标,它是如何配置的?您正在写入 SQL Server 2012 表,但包本身是 2012 包还是以前的版本?包是否在文件所在的同一台服务器上运行,它与目标表是否也在同一台服务器上? 确保您在目标数据流上使用 Open Rowset Using FastLoad 设置。这可以显着加快加载过程。当您将文件组合在一起时,这将更有帮助。 是的,在 ForEach 容器中:平面文件源 -> 派生 -> OLE DB 目标。目标配置为未选中“表锁定”,数据访问模式 = 快速加载,未选中“检查约束”。包本身是 2012 并存储在 SQL Server 上。我在 SQL Server 上没有文件访问权限,因此源文件存储在不同的服务器上。 【参考方案1】:听起来有悖常理的一件事是将您的派生列转换替换为 4,并让每个转换执行一项任务。这可以提供性能改进的原因是引擎可以更好地并行化操作,如果它可以确定这些更改是独立的。
Investigation: Can different combinations of components affect Dataflow performance? Increasing Throughput of Pipelines by Splitting Synchronous Transformations into Multiple Tasks您可能遇到网络延迟,因为您正在引用远程服务器上的文件。也许您可以通过在处理之前将这些远程文件复制到本地机器来提高性能。您感兴趣的性能计数器是
网络接口/当前带宽 网络接口/字节总数/秒 网络接口/传输/秒您可以做的另一件事是将目标列和派生列替换为行计数转换。为所有文件运行几次包,这将决定您的理论最大速度。你将无法比这更快。然后添加您的派生列并重新运行。这应该有助于您了解性能下降是由于目标、派生列操作还是包运行速度与 IO 子系统一样快。
【讨论】:
只有在有多个数据缓冲区的情况下,才能在多个转换之间拆分工作才能提高性能。如果我正确阅读原始帖子,他每个文件只处理 30 行,这总是会进入一个缓冲区。 诅咒你@mattmasson 和你卓越的 SSIS 知识!【参考方案2】:您的文件是否提供了一种简单的方法(即它们的名称)将它们细分为偶数(或大部分偶数)组?如果是这样,您可以并行运行负载。
例如,假设您可以将它们分成 4 组,每组 2,500 个文件。
-
为每个组创建一个 Foreach 循环容器。
对于每个组的目的地,将记录写入他们自己的临时表。
最后将所有临时表中的所有记录合并到您的大表中。
如果文件本身没有提供简单的分组方法,请考虑在您的合作伙伴发送文件时将它们推入子文件夹,或将文件路径插入数据库,以便编写查询来细分它们并使用文件路径字段作为数据流任务中的变量。
【讨论】:
谢谢凯尔。每个文件的文件名包括月份和年份。我已经将文件分成了一个月,每个文件夹留下了大约 1500 个文件。我设法通过调整 Ole DB 目标中的“每批次的行数”和“最大插入提交大小”设置来加快该过程。现在处理文件大约需要 1 小时(原始估计,因为它仍在处理我们所说的。 如果每个文件只有大约 30 行,那么更改“每批次的行数”不太可能对您有很大帮助。很可能所有内容都已作为一个批次提交。以上是关于SSIS 处理大量平面文件非常缓慢的主要内容,如果未能解决你的问题,请参考以下文章
与多处理一起使用时,PyTesseract 调用工作非常缓慢