我正在编写由存储队列消息触发的Azure函数。然后,它逐行读取blob,并将对数据进行处理。该行本身就是Json行。
我根据网络上的示例组装了代码,但给人的印象是出了点问题。我(在VS2017上开发中)遇到2个主要延迟。在OpenReadAsync和每个ReadlineAsync ...
因此,如果有人提出建议,我不是c#开发人员。
private static async Task ProcessFile(string fileName, ILogger log)
{
// Connect Source
CloudStorageAccount cosmobatchStorageAccount = AzureBlobHandling.GetStorageAccount(CommonCode.GetEnvironmentVariable("ComsoBatch_Storage"));
CloudBlobClient cosmobatchBlobClient = AzureBlobHandling.GetStorageClient(cosmobatchStorageAccount);
CloudBlobContainer cosmobatchBlobContainer = AzureBlobHandling.GetStorageContainer(cosmobatchBlobClient, CommonCode.GetEnvironmentVariable("CosmoBatch_Container"));
CloudBlockBlob cosmobatchBlob = cosmobatchBlobContainer.GetBlockBlobReference(fileName);
// Connect Destination
CloudStorageAccount singlefileStorageAccount = AzureBlobHandling.GetStorageAccount(CommonCode.GetEnvironmentVariable("SingleFile_Storage"));
CloudBlobClient singlefileBlobClient = AzureBlobHandling.GetStorageClient(singlefileStorageAccount);
CloudBlobContainer singlefileBlobContainer = AzureBlobHandling.GetStorageContainer(singlefileBlobClient, CommonCode.GetEnvironmentVariable("SingleFile_Container"));
//CloudBlockBlob singlefileBlob = cosmobatchBlobContainer.GetBlockBlobReference(fileName);
try
{ // Read Blob
log.LogInformation("Pass 1");
using (Stream stream = await cosmobatchBlob.OpenReadAsync())
{
log.LogInformation("Pass 2");
using (StreamReader reader = new StreamReader(stream))
{
log.LogInformation("Pass 3");
while (true)
{
log.LogInformation("Pass 4");
string line = await reader.ReadLineAsync();
if (line == null)
{
break;
}
Console.WriteLine(line);
jRecord jRec = JsonConvert.DeserializeObject<jRecord>(line);
log.LogInformation(String.Format("MsgNbr : {0}, FileName : {1}, FileType {2}", jRec.msgnbr, jRec.filename, jRec.msgtype));
}
}
}
}
catch (Exception ex)
{
log.LogError(String.Format("Catch: {0}", ex));
}
finally
{
}
}
答案 0 :(得分:2)
我可以想象OpenReadAsync
会花一些时间
启动异步操作以打开要从blob读取的流。
来源:CloudBlockBlob.OpenReadAsync Method()
它为您使用Stream
操纵Blob打下了基础。
ReadLineAsync
从当前流异步读取一行字符,并将数据作为字符串返回。
来源:StreamReader.ReadLineAsync Method
本质上是下载。因此,如果这是一条很大的线(意味着大量数据),那么可能还需要一些时间。
此外,还建议在调试模式下运行代码会降低其速度。当然,在这种情况下,由于带宽(连接速度)是本地因素,因此在本地计算机上进行这种操作要比在Azure中运行慢。
如果数字以毫秒为单位(毫秒),那么我就不用担心。否则,您可能需要查看数据的大小,以及Blob是否是此类数据的最佳存储类型。