Azure Functions - 高内存消耗和重复 Blob 上传

问题描述 投票:0回答:1

我的 Azure Functions 设置遇到两个主要问题,我正在寻求有关如何有效解决这些问题的指导。

高内存消耗: 我有一个 Azure Functions 应用程序,其中包含由计时器触发的协调器功能。它调用活动函数通过电子邮件发送报告,其中涉及创建 CSV 文件并将其上传到 Azure Blob 存储。我面临的问题是内存消耗似乎很高,尤其是在将数据传递到内存流以创建 CSV 时。这是一个问题,特别是在处理大型数据集时。如何优化代码以减少内存使用,同时仍实现所需的功能?

重复的 Blob 上传和电子邮件: 此外,我还观察到多次将数据上传到 blob 存储中的情况,导致向同一编排器发送多封电子邮件。

代码示例:



[Function("SendDataEmail")]
 public async Task<bool> SendDataEmail([ActivityTrigger] List<Data> data)
 {
       if (data == null)
       {
           //logs
           return false;
       }

       var storageConnectionString = //storageConnectionString;
       var reportRootFolder = reportRootFolder;
       var containerName = //containerName;

       var containerClient = new BlobContainerClient(storageConnectionString, containerName);

       var blobClient = containerClient.GetBlobClient($"DataSummary_{DateTime.Now.ToString("ddMMyyyy_hhmmss")}.csv");

       var isUploaded = await WriteDataAndUploadToBlob(data, blobClient);

       if (!isUploaded)
       {
           //logs
           return false;
       }

       Uri sasUri = new Uri("about:blank");

       var sasCreated = CreateSASForBlob(blobClient, out sasUri);

       if (!sasCreated)
       {
          //logs
           return false;
       }

       var subject = //subject;
       var content = //content;
       var maild=//getmail ids
       
       await SendEmail(subject, content, maild);

       return true;
   } 
   
private async Task<bool> WriteDataAndUploadToBlob(List<Data> data, BlobClient blobClient)
  {
      try
      {
          using (var writer = new StreamWriter(new MemoryStream(), Encoding.UTF8))
          {
              await writer.WriteLineAsync(@"Id,Type");

              foreach (var item in data)
              {
                  var line = $"";                                            
                                         
                  line = $"{item.Id},{item.Type}";
                  await writer.WriteLineAsync(line);
              }
              await writer.FlushAsync();
              writer.BaseStream.Seek(0, SeekOrigin.Begin);
              var ret = await blobClient.UploadAsync(writer.BaseStream, new BlobHttpHeaders { ContentType = "text/csv", ContentEncoding = "Encoding.UTF8" });
              return ret.GetRawResponse().Status == (int)HttpStatusCode.Created; 
            }
        }
              catch (Exception ex){
              }
              return true; 
    }

1-我面临的问题是内存消耗似乎很高,尤其是在将数据传递到内存流以创建 CSV 时。这是一个问题,特别是在处理大型数据集时。

2-多次将数据上传到blob存储,导致同一时间内发送多封电子邮件。

任何有关如何解决这些问题的见解或建议将不胜感激。

.net azure-functions azure-blob-storage azure-durable-functions memory-consumption
1个回答
0
投票

我将只在这里解决内存问题。不使用内存流打开 Blob 并直接写入它。

private async Task<bool> WriteDataAndUploadToBlob(List<Data> data, BlobClient blobClient)
{
    var exists = await blobClient.ExistsAsync();
    var options = new BlobOpenWriteOptions()
    {
        HttpHeaders = new BlobHttpHeaders { ContentType = "text/csv", ContentEncoding = "Encoding.UTF8" }
    };

    await using Stream targetStream = await blobClient.OpenWriteAsync(overwrite: true, options);
    await using var writer = new StreamWriter(targetStream, Encoding.UTF8);
    await writer.WriteLineAsync(@"Id,Type");

    foreach (var item in data)
    {
        var line = $"";

        line = $"{item.Id},{item.Type}";
        await writer.WriteLineAsync(line);
    }
    await writer.FlushAsync();
    return !exists;
}
© www.soinside.com 2019 - 2024. All rights reserved.