2013-04-24 2 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 в его простейшей форме, то есть мой пользовательский источник данных, записывающий данные в плоский файл назначения. У него нет никаких преобразований.

Когда я запускаю свой пакет, я могу видеть записи, записываемые в CSV-файл, в партиях около 10 000 записей (DefaultBufferMaxRows).

Моя проблема заключается в том, что эти записи записаны, но по-прежнему остаются в памяти. Это в конечном итоге заставляет мой пакет замедляться и останавливается. Вся память на моем сервере исчерпана.

Теперь я не эксперт по SSIS, но я предполагаю, что записи, которые я пишу в PipelineBuffer, не освобождаются после их потребления. слово «Буфер» подразумевает, что он может быть «покраснел». Но я не мог найти API для этого.

Итак, я думаю, мой вопрос: как я могу освободить память, выделенную для записей, которые уже были записаны в плоский файл, поэтому у меня достаточно памяти для остальных записей?

Спасибо, Nandun

ответ

0

каждый буфер будет вымывать, точнее будет повторно, как только он завершил свое путешествие по трубопроводу. Таким образом, SSIS управляет памятью для вас в этой ситуации, хотя вы должны убедиться, что у вас установлены правильные ряды и размер памяти (вы можете включить событие настройки буфера при ведении журнала, чтобы узнать, происходит ли это с вашим пакетом). Как правило, люди настраивают память вверх и не понимают, что это за компонент в потоке данных, а затем пакеты тратят значительное время, пытаясь перераспределить огромное количество RAM.

также возможно, если ваш компонент является вашим назначением, вы не освобождаете соединение, необходимое для использования диспетчера подключений, или реализуете код управления ресурсами для очистки в компоненте сценария.

Смежные вопросы