Segmentierte Objektdownloads

Eine Strategie zum Herunterladen großer Dateien wird als segmentierte Objektdownloads bezeichnet. Bei einem solchen Download werden zahlreiche GET-Anfragen parallel gestellt, wobei die Daten in einer temporären, vorab zugewiesenen Zieldatei gespeichert werden. Sobald alle Slices heruntergeladen wurden, wird die temporäre Datei in die Zieldatei umbenannt.

Segmentierte Objektdownloads können deutlich schneller sein, wenn die Netzwerk- und Laufwerkgeschwindigkeit keine einschränkenden Faktoren sind. Allerdings verursachen segmentierte Objektdownloads mehrere Schreibvorgänge an verschiedenen Stellen des Laufwerks, sodass diese Download-Strategie die Leistung von Laufwerken mit langsamen Suchzeiten beeinträchtigen kann, insbesondere wenn ein Download in eine große Anzahl von Segmenten unterteilt wird. Tools wie die Google Cloud CLI haben niedrige Standardwerte für die Anzahl der erstellten Segmente, um mögliche Leistungseinbußen zu minimieren.

Segmentierte Objektdownloads sollten immer eine schnelle zusammensetzbare Prüfsumme (CRC32C) verwenden, um die Datenintegrität der Segmente zu verifizieren. Für die Durchführung von segmentierten Objektdownloads benötigen Tools wie die gcloud CLI eine kompilierte Version von crcmod auf dem Computer, auf dem der Download durchgeführt wird. Wenn das kompilierte crcmod nicht verfügbar ist, führt die gcloud CLI stattdessen nicht segmentierte Objektdownloads aus.

So verwenden Tools und APIs segmentierte Objektdownloads

Abhängig davon, wie Sie mit Cloud Storage interagieren, werden segmentierte Objektdownloads möglicherweise automatisch in Ihrem Namen verwaltet. In diesem Abschnitt wird das Verhalten des segmentierten Objektdownloads für verschiedene Tools beschrieben und Sie erfahren, wie Sie das Verhalten ändern können.

Console

Die Google Cloud Console führt keine segmentierten Objektdownloads durch.

Befehlszeile

Standardmäßig aktiviert gcloud storage cp die segmentierten Objektdownloads. Sie können steuern, wie und wann die gcloud CLI segmentierte Objektdownloads ausführt. Ändern Sie dazu die folgenden Attribute:

  • storage/sliced_object_download_threshold: Die minimale Gesamtdateigröße für einen segmentierten Objektdownload. Sie können alle segmentierten Objektdownloads deaktivieren. Setzen Sie dazu diesen Wert auf 0.

  • storage/sliced_object_download_max_components: Die maximale Anzahl von Slices, die im Download verwendet werden sollen. Legen Sie 0 für kein Limit fest. In diesem Fall wird die Anzahl der Slices ausschließlich durch storage/sliced_object_download_component_size bestimmt.

  • storage/sliced_object_download_component_size: Die Zielgröße für jedes Download-Segment. Dieses Attribut wird ignoriert, wenn die Datei insgesamt so groß ist, dass für das Herunterladen von Slices dieser Größe mehr Slices als zulässig erforderlich sind, wie in storage/sliced_object_download_max_components festgelegt.

Um diese Attribute zu ändern, erstellen Sie eine benannte Konfiguration und wenden diese entweder mit dem projektweiten Flag --configuration pro Befehl oder für alle gcloud CLI-Befehle mit dem gcloud config set-Befehl an.

Es wird kein zusätzlicher lokaler Speicherplatz benötigt, wenn Sie die gcloud CLI für segmentierte Objektdownloads verwenden. Wenn der Download vor dem Abschluss fehlschlägt, führen Sie den Befehl noch einmal aus, um die fehlgeschlagenen Segmente fortzusetzen. Segmente, die vor dem Fehler erfolgreich heruntergeladen wurden, werden bei einem erneuten Versuch nicht noch einmal heruntergeladen, es sei denn, das Quellobjekt hat sich zwischen den Downloadversuchen geändert.

Temporäre heruntergeladene Objekte werden im Zielverzeichnis mit dem Suffix _.gstmp in ihrem Namen angezeigt.

Clientbibliotheken

Java

Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Storage Java API.

Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Cloud Storage zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

Sie können segmentierte Objektdownloads ausführen. Setzen Sie dazu AllowDivideAndConquer auf true. Beispiel:

import com.google.cloud.storage.BlobInfo;
import com.google.cloud.storage.transfermanager.DownloadResult;
import com.google.cloud.storage.transfermanager.ParallelDownloadConfig;
import com.google.cloud.storage.transfermanager.TransferManager;
import com.google.cloud.storage.transfermanager.TransferManagerConfig;
import java.nio.file.Path;
import java.util.List;

class AllowDivideAndConquerDownload {

  public static void divideAndConquerDownloadAllowed(
      List<BlobInfo> blobs, String bucketName, Path destinationDirectory) {
    TransferManager transferManager =
        TransferManagerConfig.newBuilder()
            .setAllowDivideAndConquerDownload(true)
            .build()
            .getService();
    ParallelDownloadConfig parallelDownloadConfig =
        ParallelDownloadConfig.newBuilder()
            .setBucketName(bucketName)
            .setDownloadDirectory(destinationDirectory)
            .build();
    List<DownloadResult> results =
        transferManager.downloadBlobs(blobs, parallelDownloadConfig).getDownloadResults();

    for (DownloadResult result : results) {
      System.out.println(
          "Download of "
              + result.getInput().getName()
              + " completed with status "
              + result.getStatus());
    }
  }
}

Node.js

Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Storage Node.js API.

Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Cloud Storage zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

Sie können segmentierte Objektdownloads mit der Methode downloadFileInChunks ausführen. Beispiel:

/**
 * TODO(developer): Uncomment the following lines before running the sample.
 */
// The ID of your GCS bucket
// const bucketName = 'your-unique-bucket-name';

// The ID of the GCS file to download
// const fileName = 'your-file-name';

// The path to which the file should be downloaded
// const destFileName = '/local/path/to/file.txt';

// The size of each chunk to be downloaded
// const chunkSize = 1024;

// Imports the Google Cloud client library
const {Storage, TransferManager} = require('@google-cloud/storage');

// Creates a client
const storage = new Storage();

// Creates a transfer manager client
const transferManager = new TransferManager(storage.bucket(bucketName));

async function downloadFileInChunksWithTransferManager() {
  // Downloads the files
  await transferManager.downloadFileInChunks(fileName, {
    destination: destFileName,
    chunkSizeBytes: chunkSize,
  });

  console.log(
    `gs://${bucketName}/${fileName} downloaded to ${destFileName}.`
  );
}

downloadFileInChunksWithTransferManager().catch(console.error);

Python

Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Storage Python API.

Richten Sie die Standardanmeldedaten für Anwendungen ein, um sich bei Cloud Storage zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

Sie können segmentierte Objektdownloads mit der Methode download_chunks_concurrently ausführen. Beispiel:

def download_chunks_concurrently(
    bucket_name, blob_name, filename, chunk_size=32 * 1024 * 1024, workers=8
):
    """Download a single file in chunks, concurrently in a process pool."""

    # The ID of your GCS bucket
    # bucket_name = "your-bucket-name"

    # The file to be downloaded
    # blob_name = "target-file"

    # The destination filename or path
    # filename = ""

    # The size of each chunk. The performance impact of this value depends on
    # the use case. The remote service has a minimum of 5 MiB and a maximum of
    # 5 GiB.
    # chunk_size = 32 * 1024 * 1024 (32 MiB)

    # The maximum number of processes to use for the operation. The performance
    # impact of this value depends on the use case, but smaller files usually
    # benefit from a higher number of processes. Each additional process occupies
    # some CPU and memory resources until finished. Threads can be used instead
    # of processes by passing `worker_type=transfer_manager.THREAD`.
    # workers=8

    from google.cloud.storage import Client, transfer_manager

    storage_client = Client()
    bucket = storage_client.bucket(bucket_name)
    blob = bucket.blob(blob_name)

    transfer_manager.download_chunks_concurrently(
        blob, filename, chunk_size=chunk_size, max_workers=workers
    )

    print("Downloaded {} to {}.".format(blob_name, filename))

REST APIs

Sowohl die JSON API als auch die XML API unterstützen Bereichs-GET-Anfragen. Sie können also beide APIs verwenden, um Ihre eigene Strategie für einen segmentierten Objektdownload zu implementieren.

Um vor Datenbeschädigung durch das Ändern des Quellobjekts während des Downloads zu schützen, sollten Sie in jeder Download-Anfrage für ein Segment des Objekts die Generierungsnummer des Quellobjekts angeben.