Итак, это относится к работе с большой кучей объектов и попытке минимизировать количество раз, когда я инстанцирую байт[]. В общем, у меня возникают 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)
{
// весь следующий код идет здесь
}
Затем я заполняю свой массив byte[] из внешнего источника:
FileToProcess = new BiztalkBinariesData()
.Get(currentDocument.SubmissionSetId, currentDocument.FullFileName);
Вот в чем вопрос. Было бы намного чище передавать текущий документ (IClaimDocument) другим методам для обработки. Итак, если я установлю часть данных текущегоДокумента в предварительно отформатированный массив, будет ли это использовать существующую ссылку? Или это создаст новый массив в большой куче объектов?
currentDocument.Data = FileToProcess;
В конце цикла я бы очистил FileToProcess
Array.Clear(FileToProcess, 0, FileToProcess.length);
Это было понятно? Если нет, то попробую убрать.