【问题标题】:SSIS Buffer allocation failedSSIS 缓冲区分配失败
【发布时间】:2020-03-06 01:35:56
【问题描述】:

我在 SSIS 中有一个父包,每个循环容器都按顺序执行 2 个子包。连接值作为参数传递给子包。子包动态连接到平面文件源,派生列用于将“\N”值替换为 NULL,并最终加载到 SQL 服务器目标中。平面文件源的总大小为 3GB。 for-each 循环在第一次迭代中执行,但在第二次迭代中失败。我收到缓冲区分配失败的错误消息。

错误信息 系统报告 85% 的内存负载。有 32767590400 字节的物理内存,其中 4636983296 字节可用。有 4294836224 字节的虚拟内存,其中 362987520 字节可用。分页文件有 43437899776 字节,其中 13638811648 字节空闲。

数据流任务未能创建缓冲区以调用 PrimeOutput 以在组件“平面文件源输出”(27) 上输出“平面文件源”(23)。此错误通常是由于内存不足造成的。

内存压力得到缓解,缓冲区管理器不再限制分配 (在缓冲区调整日志中)

我已将默认缓冲区大小从 10 MB 更改为 50 MB,并将默认缓冲区最大行数从 10000 更改为 50000。对于大于 100MB 的文件,我还将每批的行数更改为 10000。

不过,我也面临同样的问题。谁能帮我解决这个问题?

谢谢, 阿布舍克

【问题讨论】:

    标签: sql-server ssis out-of-memory


    【解决方案1】:

    我建议将 AutoAdjustBufferSize 设置为 True
    然后你需要计算表格行的最大大小。 您可以使用此 SQL 替换引号中的表和架构:

    SELECT
        SUM (max_length)  [row_length]
        ,104857600.0/SUM (max_length) [Max_100MB_Buffer_Rows]
        ,2147483647.0/SUM (max_length) [Max_2GB_Buffer_Rows]
    FROM  sys.tables t
    JOIN sys.columns c ON t.object_id=c.object_id
    JOIN sys.schemas s ON t.schema_id=s.schema_id
    WHERE t.name = '{my_table_name}' AND s.name = '{my_schema_name}'
    

    然后根据您的软件包的版本(2015 年或 2017 年),您可以使用 100MB 缓冲区(2015 年)或 2GB 缓冲区(2017 年)。
    为了安全起见,请使用 100MB 缓冲区。
    基本上,您需要根据数据的宽度设置一个好的 Max num rows(不要太高)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-11
      • 1970-01-01
      • 1970-01-01
      • 2018-02-05
      • 2012-02-26
      • 1970-01-01
      相关资源
      最近更新 更多