Azure Функция нехватка памяти исключение - PullRequest
0 голосов
/ 15 марта 2020

Я читаю PDF-файлы из Blob и выполняю некоторые операции с использованием функции Azure. Когда размер PDF составляет 1,5 ГБ (или больше), моя функция azure завершается с ошибкой из-за нехватки памяти, как только код достигает команды ниже.

var ms = new MemoryStream();
log.LogInformation("Converting this File to memorystream : " + blob.Uri);
blob.DownloadToStream(ms);  //Failes HERE.

Я попытался увеличить план, переключившись на EP3 (14 ГБ) Память + 840 АКС). Но проблема все та же. Нужно ли мне изменить какую-то другую конфигурацию? Как об этом можно позаботиться.

Microsoft.Azure.Storage.StorageException: Exception of type 'System.OutOfMemoryException' was thrown.
 ---> System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.
   at System.IO.MemoryStream.set_Capacity(Int32 value)
   at System.IO.MemoryStream.EnsureCapacity(Int32 value)
   at System.IO.MemoryStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at System.IO.MemoryStream.WriteAsync(Byte[] buffer, Int32 offset, Int32 count, CancellationToken cancellationToken)
--- End of stack trace from previous location where exception was thrown ---
   at Microsoft.Azure.Storage.Core.Util.AsyncStreamCopier`1.StartCopyStreamAsyncHelper(Nullable`1 copyLength, Nullable`1 maxLength, CancellationToken token)
   at Microsoft.Azure.Storage.Core.Util.AsyncStreamCopier`1.StartCopyStreamAsync(Nullable`1 copyLength, Nullable`1 maxLength, CancellationToken cancellationToken)
   at Microsoft.Azure.Storage.Core.Executor.Executor.ExecuteAsync[T](RESTCommand`1 cmd, IRetryPolicy policy, OperationContext operationContext, CancellationToken token)
   --- End of inner exception stack trace ---
   at Microsoft.Azure.Storage.Core.Executor.Executor.ExecuteAsync[T](RESTCommand`1 cmd, IRetryPolicy policy, OperationContext operationContext, CancellationToken token)
   at Microsoft.Azure.Storage.Core.Executor.Executor.<>c__DisplayClass0_0`1.<ExecuteSync>b__0()
   at Microsoft.Azure.Storage.Core.Util.CommonUtility.RunWithoutSynchronizationContext[T](Func`1 actionToRun)
   at Microsoft.Azure.Storage.Core.Executor.Executor.ExecuteSync[T](RESTCommand`1 cmd, IRetryPolicy policy, OperationContext operationContext)
   at Microsoft.Azure.Storage.Blob.CloudBlob.DownloadRangeToStream(Stream target, Nullable`1 offset, Nullable`1 length, AccessCondition accessCondition, BlobRequestOptions options, OperationContext operationContext)
   at Microsoft.Azure.Storage.Blob.CloudBlob.DownloadToStream(Stream target, AccessCondition accessCondition, BlobRequestOptions options, OperationContext operationContext)

1 Ответ

0 голосов
/ 15 марта 2020

Этот блог звучит так, как будто он выявил проблему - MemoryStream использует int32 для установки его емкости, без возможности использовать большее число. Я не могу полностью согласовать значение int32.MaxValue (2147483647) с указанным размером (1,5 ГБ в байтах - 1610612736 байт), но он кажется достаточно близким, чтобы быть виновником. В блоге предлагается решение для записи большого содержимого в хранилище BLOB-объектов, но я не понимаю, как это может работать в вашем случае использования.

Если вам определенно необходимо использовать MemoryStream для удовлетворения потребностей используемой вами библиотеки, обработка файлов такого размера будет невозможна.

...