我的 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存储,导致同一时间内发送多封电子邮件。
任何有关如何解决这些问题的见解或建议将不胜感激。
我将只在这里解决内存问题。不使用内存流打开 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;
}