У меня есть процесс в Azure, который генерирует большое количество файлов отчетов в формате pdf и сохраняет их в хранилище больших двоичных объектов.Вместо того, чтобы отправлять ссылки на все это по отдельности, я создаю zip-файл и отправляю эту ссылку пользователям.
Этот процесс выполняется в одном процессе и работает нормально.В последнее время я получаю ошибки исключения OutOfMemory при добавлении файлов в zip-архив, и я изо всех сил пытаюсь найти решение.
Ниже приведен код, который я использую для создания zip-файла (примечание: использование SharpLibZipбиблиотека).В настоящее время происходит сбой с OutOfMemoryException после добавления около 45 файлов по 3,5 МБ на файл (PDF).Ошибка возникает, когда я попадаю в строку: zipStream.PutNextEntry (newEntry).
Кто-нибудь знает, как я могу улучшить этот процесс?Кажется, небольшой файл zip потерпит неудачу на этом уровне.
Using outputMemStream As New MemoryStream()
Using zipStream As New ICSharpCode.SharpZipLib.Zip.ZipOutputStream(outputMemStream)
zipStream.SetLevel(7)
Dim collD3 As UserSurveyReportCollection = GetFileList(RequestID)
For Each entityD2 As UserSurveyReport In collD3
Try
Dim strF As String = entityD2.FileLocation
'Download blob as memorystream and add this stream to the zip file
Dim msR As New MemoryStream
msR = objA.DownloadBlobAsMemoryStream(azureAccount, ReportFolder, entityD2.FileName)
msR.Seek(0, SeekOrigin.Begin)
'Determine file name used in zip file archive for item
Dim strZipFileName As String = DetermineZipSourceName(entityD2, strFolder, strFileName)
'Add MemoryStream to ZipFile Stream
Dim newEntry As ICSharpCode.SharpZipLib.Zip.ZipEntry = New ICSharpCode.SharpZipLib.Zip.ZipEntry(strZipFileName)
newEntry.DateTime = DateTime.Now
zipStream.PutNextEntry(newEntry)
msR.CopyTo(zipStream)
zipStream.CloseEntry()
msR = Nothing
zipStream.Flush()
intCounter += 1
End If
Catch exZip As Exception
End Try
Next
zipStream.IsStreamOwner = False
zipStream.Finish()
zipStream.Close()
outputMemStream.Position = 0
Dim bytes As Byte() = outputMemStream.ToArray()
result.Comment = objA.UploadBlob(bytes, azureAccount, ReportFolder, entityReport.FileName).AbsolutePath
End Using
End Using