我正在参考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-Server
我将贴出一些代码,对于那些试图回答我的问题的人来说可能会很有用:
现在问题是:我的数据集非常大,比如说一百万个记录。我有一个 SSIS 包,最简单的形式就是自定义数据源将数据写入平面文件目标。它没有任何转换。
当我运行我的包时,我可以看到记录以大约 10,000 条记录(DefaultBufferMaxRows)的批次写入 CSV 文件。
我的问题是,尽管这些记录被写入,但似乎仍然停留在内存中。这最终会导致我的包变慢并停止。我的服务器中所有的内存都被使用了。
现在我不是 SSIS 专家,但我认为在将记录写入 PipelineBuffer 后,它们没有被释放。"缓冲"这个词让我觉得它可以被"刷新"。但是我找不到任何 API 来做到这一点。
所以我的问题是,如何释放已经写入平面文件的记录所分配的内存,以便为剩余的记录腾出足够的内存?
谢谢, Nandun
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