Скачивание больших объемов случайных данных из службы хранилища Azure
Это руководство представляет собой первую часть цикла. Из этого руководства можно узнать, как скачать большие объемы данных из службы хранилища Azure.
В третьей части цикла вы узнаете, как выполнять такие задачи:
- Обновление приложения
- Выполнение приложения
- Проверка количества подключений.
Предварительные требования
Для работы с этим руководством необходимо изучить предыдущее руководство по использованию хранилища: Передача больших объемов случайных данных в параллельном режиме в службу хранилища Azure.
Удаленное подключение к виртуальной машине
Для создания сеанса удаленного рабочего стола с виртуальной машиной используйте следующую команду на вашем локальном компьютере. Замените IP-адрес значением publicIPAddress виртуальной машины. При появлении запроса введите учетные данные, использованные при создании виртуальной машины.
mstsc /v:<publicIpAddress>
Обновление приложения
Из предыдущего руководства вы узнали, как отправлять файлы в учетную запись хранения. Откройте D:\git\storage-dotnet-perf-scale-app\Program.cs
в текстовом редакторе. Замените метод Main
следующим примером. В этом примере комментируется задача отправки и расскомментируется задача скачивания, а также, по завершении, задача удаления содержимого в учетной записи хранения.
public static void Main(string[] args)
{
Console.WriteLine("Azure Blob storage performance and scalability sample");
// Set threading and default connection limit to 100 to
// ensure multiple threads and connections can be opened.
// This is in addition to parallelism with the storage
// client library that is defined in the functions below.
ThreadPool.SetMinThreads(100, 4);
ServicePointManager.DefaultConnectionLimit = 100; // (Or More)
bool exception = false;
try
{
// Call the UploadFilesAsync function.
// await UploadFilesAsync();
// Uncomment the following line to enable downloading of files from the storage account.
// This is commented out initially to support the tutorial at
// https://learn.microsoft.com/azure/storage/blobs/storage-blob-scalable-app-download-files
await DownloadFilesAsync();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
exception = true;
}
finally
{
// The following function will delete the container and all files contained in them.
// This is commented out initially as the tutorial at
// https://learn.microsoft.com/azure/storage/blobs/storage-blob-scalable-app-download-files
// has you upload only for one tutorial and download for the other.
if (!exception)
{
// await DeleteExistingContainersAsync();
}
Console.WriteLine("Press any key to exit the application");
Console.ReadKey();
}
}
После обновления приложения его снова необходимо создать. Откройте Command Prompt
и перейдите к D:\git\storage-dotnet-perf-scale-app
. Перестройте приложение, выполнив dotnet build
, как показано в следующем примере:
dotnet build
Выполнение приложения
Перестроив приложение, можно запустить его с обновленным кодом. Откройте Command Prompt
(если еще не сделали этого) и перейдите к D:\git\storage-dotnet-perf-scale-app
.
Нажмите клавишу dotnet run
, чтобы запустить приложение.
dotnet run
Задание DownloadFilesAsync
, показано в следующем примере:
Приложение считывает контейнеры, расположенные в учетной записи хранения, указанной в storageconnectionstring. Оно проходит большие двоичные объекты по одному при помощи метода GetBlobs и скачивает их на локальный компьютер при помощи метода DownloadToAsync.
private static async Task DownloadFilesAsync()
{
BlobServiceClient blobServiceClient = GetBlobServiceClient();
// Path to the directory to upload
string downloadPath = Directory.GetCurrentDirectory() + "\\download\\";
Directory.CreateDirectory(downloadPath);
Console.WriteLine($"Created directory {downloadPath}");
// Specify the StorageTransferOptions
var options = new StorageTransferOptions
{
// Set the maximum number of workers that
// may be used in a parallel transfer.
MaximumConcurrency = 8,
// Set the maximum length of a transfer to 50MB.
MaximumTransferSize = 50 * 1024 * 1024
};
List<BlobContainerClient> containers = new List<BlobContainerClient>();
foreach (BlobContainerItem container in blobServiceClient.GetBlobContainers())
{
containers.Add(blobServiceClient.GetBlobContainerClient(container.Name));
}
// Start a timer to measure how long it takes to download all the files.
Stopwatch timer = Stopwatch.StartNew();
// Download the blobs
try
{
int count = 0;
// Create a queue of tasks that will each upload one file.
var tasks = new Queue<Task<Response>>();
foreach (BlobContainerClient container in containers)
{
// Iterate through the files
foreach (BlobItem blobItem in container.GetBlobs())
{
string fileName = downloadPath + blobItem.Name;
Console.WriteLine($"Downloading {blobItem.Name} to {downloadPath}");
BlobClient blob = container.GetBlobClient(blobItem.Name);
// Add the download task to the queue
tasks.Enqueue(blob.DownloadToAsync(fileName, default, options));
count++;
}
}
// Run all the tasks asynchronously.
await Task.WhenAll(tasks);
// Report the elapsed time.
timer.Stop();
Console.WriteLine($"Downloaded {count} files in {timer.Elapsed.TotalSeconds} seconds");
}
catch (RequestFailedException ex)
{
Console.WriteLine($"Azure request failed: {ex.Message}");
}
catch (DirectoryNotFoundException ex)
{
Console.WriteLine($"Error parsing files in the directory: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"Exception: {ex.Message}");
}
}
Проверка подключений
Во время скачивания файлов можно проверить число одновременных подключений к учетной записи хранения. Откройте окно консоли и введите netstat -a | find /c "blob:https"
. Эта команда показывает количество подключений, которые открыты в настоящее время. Как видно из следующего примера, при скачивании файлов из учетной записи хранения было открыто более 280 подключений.
C:\>netstat -a | find /c "blob:https"
289
C:\>
Следующие шаги
Из третьей части в серии вы узнали о скачивании больших объемов данных из учетной записи хранения, в том числе о следующем:
- Выполнение приложения
- Проверка количества подключений.
Перейдите к четвертой части в серии, чтобы проверить показатели пропускной способности и задержки на портале.
Verify throughput and latency metrics for a storage account (Проверка показателей пропускной способности и задержки для учетной записи хранения)