我在SSIS中有一个父程序包,该程序包的每个循环容器都以顺序方式执行2个子程序包。连接值作为参数传递到子程序包。子程序包动态连接到平面文件源,并且使用派生列将NULL替换为\ N,最后将其加载到SQL Server目标位置。平面文件源的总大小为3GB。 for-each循环在第一次迭代中执行,但是在第二次迭代中失败。我收到缓冲区分配失败的错误消息。
错误消息系统报告内存负载为85%。有32767590400字节的物理内存和4636983296字节可用。有4294836224字节的虚拟内存,其中362987520字节可用。分页文件有43437899776字节,可用的13638811648字节。
“数据流”任务未能创建一个缓冲区来调用组件“平面文件源输出”(27)上的输出“平面文件源”(23)的PrimeOutput。此错误通常是由于内存不足的情况而发生的。
内存压力得到缓解,缓冲区管理器不再限制分配(在缓冲区调整日志中)
我已将默认缓冲区大小从10 MB更改为50 MB,并将默认缓冲区最大行从10000更改为50000。还将大于100MB的文件的每批行更改为10000。
仍然,我面临着同样的问题。谁能帮我解决这个问题?
谢谢,阿比舍克
我建议将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缓冲区。基本上,您需要根据数据的宽度设置一个好的最大行数(不要太高)。