繁体   English   中英

Azure Function - System.OutOfMemoryException

[英]Azure Function - System.OutOfMemoryException

我有一个 Az Function,我在处理大文件时遇到问题。

我下载文件的片段是这样的:

    public byte[] DownloadBlobBytes(BlobContainerClient blobContainerClient, string blobName)
    {
        BlobClient blobClient = blobContainerClient.GetBlobClient(blobName);

        if (!blobClient.Exists())
        {
            throw new FileNotFoundException("File not found in Azure Blob Storage.", blobName);
        }

        _logger.LogDebug("Starting download of blob '{BlobUri}' from Azure Blob Storage.", blobClient.Uri);

        return blobClient.DownloadContent().Value.Content.ToArray();
    }

在生产环境运行会报这个错:

    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.Stream.CopyTo(Stream destination, Int32 bufferSize)
   at System.BinaryData.FromStreamAsync(Stream stream, Boolean async, CancellationToken cancellationToken)
   at System.BinaryData.FromStream(Stream stream)
   at Azure.Storage.Blobs.Specialized.BlobBaseClient.DownloadContentInternal(BlobRequestConditions conditions, Boolean async, CancellationToken cancellationToken)
   at Azure.Storage.Blobs.Specialized.BlobBaseClient.DownloadContent(BlobRequestConditions conditions, CancellationToken cancellationToken)
   at Azure.Storage.Blobs.Specialized.BlobBaseClient.DownloadContent(CancellationToken cancellationToken)
   at Azure.Storage.Blobs.Specialized.BlobBaseClient.DownloadContent()
   at ThomsonReuters.DocMi.Infrastructure.Communication.Azure.AzureBlobStorageClient.DownloadBlobBytes(BlobContainerClient blobContainerClient, String blobName)

在本地它工作得很好,但在生产中却没有。

搜索我看到在文档Azure 函数限制中,每个实例有 1.5GB 的 memory 限制。

我可以解决这个只在生产中发生的问题吗?

从文件下载字节时,我能做些什么来减少 memory 的使用?

1.5GB 是消费计划中可用的 memory。 如果将 function 部署到应用服务计划/专用计划,您可以获得更多。 但是那里可能会产生成本影响,因此您需要考虑这一点。

对于这种情况,通常可以归结为 2 个核心选项:

  1. 将大文件拆分成较小的块,然后处理这些文件以减少所需的资源

  2. 使用流 - 如果你有一个 2GB 的文件,你使用的方法将永远不会工作,因为它试图将整个文件加载到 memory。相反,使用blobClient.OpenRead ( docs ) - 这只会在你阅读时下载内容stream。

例如,如果您尝试从 1 个源下载文件并将其存储在其他位置,您应该能够使用 stream 到 stream 从 1 到另一个的内容,而无需将所有内容下载到 memory。或者如果您正在尝试做一些事情,比如对文件做一些处理——使用 stream 以块的形式读取内容(例如读取 100 行,做一些处理,读取下 100 行)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM