byte[] и эффективная передача по ссылке

Итак, это относится к работе с большой кучей объектов и попытке минимизировать количество раз, когда я инстанцирую байт[]. В общем, у меня возникают OutOfMemoryExceptions, и мне кажется, что это происходит потому, что мы инстанцируем слишком много массивов байтов. Программа отлично работает, когда мы обрабатываем пару файлов, но ей нужно масштабироваться, а в настоящее время она не может этого сделать.

В двух словах, у меня есть цикл, который извлекает документы из базы данных. В настоящее время он извлекает по одному документу за раз, а затем обрабатывает его. Документы могут быть от менее мегабайта до 400+ мегабайт. (именно поэтому я обрабатываю по одному документу за раз). Ниже приведен псевдокод, который я оптимизировал.

Итак, я делаю следующие шаги:

  1. Делаю вызов базы данных, чтобы найти самый большой размер файла (и затем умножаю его на 1.1)

    var maxDataSize = new BiztalkBinariesData().GetMaxFileSize();
    maxDataSize = (maxDataSize != null && maxDataSize > 0)
     ? (long)(maxDataSize * 1.1)
     : 0;
    var FileToProcess = new byte[maxDataSize];
    
  2. Затем я делаю еще один вызов базы данных, извлекаю все документы (без данных) из базы данных и помещаю их в IEnumerable.

    UnprocessedDocuments =
     claimDocumentData.Select(StatusCodes.CurrentStatus.WaitingToBeProcessed);
    foreach (var currentDocument in UnprocessDocuments)
    {
     // весь следующий код идет здесь
    }
    
  3. Затем я заполняю свой массив byte[] из внешнего источника:

    FileToProcess = new BiztalkBinariesData()
     .Get(currentDocument.SubmissionSetId, currentDocument.FullFileName);
    
  4. Вот в чем вопрос. Было бы намного чище передавать текущий документ (IClaimDocument) другим методам для обработки. Итак, если я установлю часть данных текущегоДокумента в предварительно отформатированный массив, будет ли это использовать существующую ссылку? Или это создаст новый массив в большой куче объектов?

    currentDocument.Data = FileToProcess;
    
  5. В конце цикла я бы очистил FileToProcess

    Array.Clear(FileToProcess, 0, FileToProcess.length);
    

Это было понятно? Если нет, то попробую убрать.

5
задан Yahia 31 January 2012 в 16:19
поделиться