PipelineBuffer не освобождает память

Я следую этому прекрасному сообщению 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 для этого.

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

Спасибо, Нандун.


person Nandun    schedule 24.04.2013    source источник


Ответы (1)


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

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

person Jason Horner    schedule 01.02.2015