2013-04-24 132 views
3

我正在关注以下优秀职位Rainer Stropek:1.创建自定义SSIS数据流项目& 2.从Azure表存储中提取数据。 http://www.software-architects.com/devblog/2010/11/12/Custom-SSIS-Data-Source-For-Loading-Azure-Tables-Into-SQL-ServerPipelineBuffer不释放内存

我将粘贴代码,将是任何感兴趣的人谁是试图回答我的问题:

GenericTableContext context = new GenericTableContext(cloudStorageAccount.TableEndpoint.AbsoluteUri, cloudStorageAccount.Credentials); 

public override void PrimeOutput(int outputs, int[] outputIDs, PipelineBuffer[] buffers) { 
    IDTSOutput100 output = ComponentMetaData.OutputCollection[0]; 
    PipelineBuffer buffer = buffers[0]; 
    foreach(var item in this.context.CreateQuery<GenericEntity>("SomeTable") { 
    buffer.AddRow(); 
    for (int x = 0; x < columnInformation.Count; x++) { 
     var ci = (ColumnInfo) columnInformation[x]; 
     var value = item[ci.ColumnName].Value; 
     if (value != null) { 
     buffer[ci.BufferColumnIndex] = value; 
     } else { 
     buffer.SetNull(ci.BufferColumnIndex); 
     } 
    } 
    } 

现在问题:

我的数据集非常大;让我们说一百万条记录。我有一个最简单形式的SSIS包,即我的自定义数据源将数据写入平面文件目标。它没有变化。

当我运行我的软件包时,我可以看到以大约10,000条记录(DefaultBufferMaxRows)批量写入CSV文件的记录。

我的问题是,虽然这些记录被写入,但它似乎仍然留在内存中。这最终导致我的软件包放慢速度并停下来。我服务器中的所有内存都用完了。

现在我不是SSIS专家,但我假设我写入到PipelineBuffer的记录没有在它们被消耗后被释放。 “缓冲”这个词暗示我可能会被“冲洗”。但我找不到任何API来执行此操作。

所以我想我的问题是,我如何释放分配给已经写入平面文件的记录的内存,以便剩余记录有足够的内存?

谢谢 Nandun

回答

0

每个缓冲区将刷新,一旦完成了通过管道的旅程更精确地重复使用。所以在这种情况下,SSIS为你管理内存,尽管你必须确保你已经分配了合适的行和内存大小(你可以在日志中打开缓冲区调整事件来查看这是否发生在你的包上)。通常情况下,人们会调整内存并且无法意识到它是数据流中的每个组件,并且随后这些软件包花费大量时间试图分配大量内存。

如果您的组件是目标,您也不可能释放连接管理器或实施资源管理代码清理脚本组件所需的连接。