SSIS 缓冲区分配失败

SSIS Buffer allocation failed

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

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

数据流任务无法创建缓冲区来为组件 "Flat File Source Output" (27) 上的输出 "Flat File Source" (23) 调用 PrimeOutput。此错误通常是由于内存不足造成的。

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

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

我仍然面临同样的问题。谁能帮我解决这个问题?

谢谢, 阿布舍克

我建议将 AutoAdjustBufferSize 设置为 True
然后你需要计算table行的最大尺寸。 您可以在替换 table 和引号中的架构的地方使用此 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 缓冲区。
基本上,您需要根据数据的宽度设置一个好的最大行数(不要太高)。