Herunterladen großer Mengen von Zufallsdaten von Azure Storage

Dieses Tutorial ist der dritte Teil einer Reihe. In diesem Tutorial wird gezeigt, wie Sie große Datenmengen von Azure Storage herunterladen.

Im dritten Teil der Serie lernen Sie Folgendes:

  • Aktualisieren der Anwendung
  • Ausführen der Anwendung
  • Überprüfen der Anzahl von Verbindungen

Voraussetzungen

Damit Sie dieses Tutorial abschließen können, müssen Sie das vorherige Storage-Tutorial abgeschlossen haben: Paralleles Hochladen großer Mengen von Zufallsdaten in ein Azure Storage-Konto.

Herstellen einer Remoteverbindung mit dem virtuellen Computer

Führen Sie auf Ihrem lokalen Computer den folgenden Befehl aus, um eine Remotedesktopsitzung mit dem virtuellen Computer zu erstellen. Ersetzen Sie die IP-Adresse mit dem publicIPAddress-Wert des virtuellen Computers. Geben Sie nach Aufforderung die beim Erstellen des virtuellen Computers verwendeten Anmeldeinformationen ein.

mstsc /v:<publicIpAddress>

Aktualisieren der Anwendung

Im vorherigen Tutorial haben Sie nur Dateien in das Speicherkonto hochgeladen. Öffnen Sie D:\git\storage-dotnet-perf-scale-app\Program.cs in einem Text-Editor. Ersetzen Sie die Main-Methode durch das folgende Beispiel. In diesem Beispiel wird der Uploadtask auskommentiert, und die Auskommentierung des Downloadtasks und des Tasks zum Löschen des Inhalts im Speicherkonto nach Abschluss des Vorgangs wird aufgehoben.

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();
    }
}

Nachdem die Anwendung aktualisiert wurde, müssen Sie die Anwendung neu erstellen. Öffnen Sie eine Command Prompt, und navigieren Sie zu D:\git\storage-dotnet-perf-scale-app. Erstellen Sie die Anwendung neu, indem Sie dotnet build ausführen wie im folgenden Beispiel dargestellt:

dotnet build

Ausführen der Anwendung

Nachdem die Anwendung neu erstellt wurde, können Sie die Anwendung mit dem aktualisierten Code ausführen. Öffnen Sie eine Command Prompt (falls nicht bereits geöffnet), und navigieren Sie zu D:\git\storage-dotnet-perf-scale-app.

Drücken Sie dotnet run, um die Anwendung auszuführen.

dotnet run

Der DownloadFilesAsync-Task ist im folgenden Beispiel dargestellt:

Die Anwendung liest die Container, die sich im Speicherkonto befinden, das in der storageconnectionstring angegeben ist. Sie durchläuft die Blobs mithilfe der Methode GetBlobs und lädt sie mithilfe der Methode DownloadToAsync auf den lokalen Computer herunter.

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}");
    }
}

Überprüfen der Verbindungen

Während die Dateien heruntergeladen werden, können Sie die Anzahl der gleichzeitigen Verbindungen mit Ihrem Speicherkonto überprüfen. Öffnen Sie ein Konsolenfenster, und geben Sie netstat -a | find /c "blob:https" ein. Mit diesem Befehl wird die Anzahl der aktuell geöffneten Verbindungen angezeigt. Wie aus dem folgenden Beispiel hervorgeht, waren über 280 Verbindungen geöffnet, als die Dateien aus dem Speicherkonto heruntergeladen wurden:

C:\>netstat -a | find /c "blob:https"
289

C:\>

Nächste Schritte

Im dritten Teil der Serie haben Sie erfahren, wie Sie große Mengen von Daten aus einem Speicherkonto herunterladen können, und haben u. a. Folgendes gelernt:

  • Ausführen der Anwendung
  • Überprüfen der Anzahl von Verbindungen

Fahren Sie mit dem vierten Teil der Serie fort, um Durchsatz- und Latenzmetriken im Portal zu überprüfen.