Так что это связано с работой с кучей больших объектов и попыткой свести к минимуму количество раз, когда я создаю экземпляр байта [].По сути, у меня есть OutOfMemoryExceptions, и я чувствую, что это потому, что мы создаем слишком много байтовых массивов.Программа отлично работает, когда мы обрабатываем пару файлов, но ее нужно масштабировать, и в настоящее время она не может.
В двух словах, у меня есть цикл, который извлекает документы из базы данных.В настоящее время он извлекает по одному документу за раз, а затем обрабатывает документ.Документы могут варьироваться от менее чем мег до 400+ мег.(следовательно, почему я обрабатываю по одному).Ниже приведен псевдокод, и до того, как я его оптимизировал.
Итак, я делаю следующие шаги:
Позвоните в базу данных, чтобы найти самую большуюразмер файла (а затем умножить его на 1,1)
var maxDataSize = new BiztalkBinariesData().GetMaxFileSize();
maxDataSize = (maxDataSize != null && maxDataSize > 0)
? (long)(maxDataSize * 1.1)
: 0;
var FileToProcess = new byte[maxDataSize];
Затем я делаю еще один вызов базы данных, извлекая все документы (без данных) из базы данных и помещая их в IEnumerable.
UnprocessedDocuments =
claimDocumentData.Select(StatusCodes.CurrentStatus.WaitingToBeProcessed);
foreach (var currentDocument in UnprocessDocuments)
{
// all of the following code goes here
}
Затем я заполняю свой массив байтов [] из внешнего источника:
FileToProcess = new BiztalkBinariesData()
.Get(currentDocument.SubmissionSetId, currentDocument.FullFileName);
Вот вопрос.Было бы намного чище передать currentDocument (IClaimDocument) другим методам для обработки.Так что, если я установлю часть данных currentDocument в предварительно отформатированный массив, будет ли он использовать существующую ссылку?Или это создает новый массив в куче больших объектов?
currentDocument.Data = FileToProcess;
В конце цикла я бы очистил FileToProcess
Array.Clear(FileToProcess, 0, FileToProcess.length);
Это было ясно?Если нет, я постараюсь почистить.