Я следую этому прекрасному сообщению Rainer Stropek о 1. создании 2. настраиваемый элемент потока данных SSIS и извлечение данных из хранилища таблиц Azure. http://www.software-architects.com/devblog/2010/11/12/Custom-SSIS-Data-Source-For-Loading-Azure-Tables-Into-SQL-Server
Я вставлю код, который будет интересен всем, кто пытается ответить на мой вопрос:
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 в его простейшей форме, т. е. мой пользовательский источник данных, записывающий данные в плоский файл назначения. В нем нет трансформаций.
Когда я запускаю свой пакет, я вижу, что записи записываются в файл CSV партиями примерно по 10 000 записей (DefaultBufferMaxRows).
Моя проблема в том, что хотя эти записи и записываются, они все равно остаются в памяти. Что в конечном итоге заставляет мой пакет замедляться и останавливаться. Вся память на моем сервере израсходована.
Теперь я не эксперт SSIS, но я предполагаю, что записи, которые я записываю в PipelineBuffer, не освобождаются после их использования. слово «буфер» подразумевает для меня, что его можно «сбросить». Но я не смог найти никакого API для этого.
Итак, я думаю, мой вопрос: как я могу освободить память, выделенную для записей, которые уже были записаны в плоский файл, чтобы у меня было достаточно памяти для оставшихся записей?
Спасибо, Нандун.