Прочтите Azure Blob Async, почему 2 задержки - PullRequest
1 голос
/ 15 июня 2019

Я пишу функцию 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
        {
        }
    }

1 Ответ

2 голосов
/ 16 июня 2019

Я могу себе представить, что OpenReadAsync займет некоторое время, так как

Инициирует асинхронную операцию, чтобы открыть поток для чтения из большого двоичного объекта.

Источник: Метод CloudBlockBlob.OpenReadAsync ()

Он закладывает основу, позволяющую вам манипулировать большим двоичным объектом с помощью Stream.

ReadLineAsync

Считывает строку символов асинхронно из текущего потока и возвращает данные в виде строки.

Источник: Метод StreamReader.ReadLineAsync

По сути, это загрузка.Так что, если это огромная строка (что означает много данных), это также может занять некоторое время.

Также обратите внимание, что запуск кода в режиме отладки замедляет его.И, конечно, этот тип манипуляций медленнее на локальном компьютере, чем запуск его в Azure, поскольку пропускная способность (скорость вашего соединения) является фактором в этом сценарии.

Если числа находятся в (low-сто) миллисекунд, я бы не волновался на твоем месте.В противном случае, возможно, вы захотите взглянуть на размер данных, и если BLOB-объект является лучшим типом хранилища для этого типа данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...