Download di oggetti suddivisi

Una strategia per scaricare file di grandi dimensioni è il download di oggetti suddivisi. In un download di questo tipo, le richieste GET con intervallo vengono effettuate in parallelo, memorizzando i dati in un file di destinazione temporaneo preallocato. Quando tutte le sezioni hanno ricevuto completato il download, il file temporaneo viene rinominato nel file di destinazione.

Il download di oggetti suddivisi può essere molto più rapido se rete e disco la velocità non è un fattore limitante; tuttavia, i download di oggetti suddivisi causano in diverse posizioni sul disco, quindi questa strategia di download può peggiora le prestazioni dei dischi con tempi di ricerca lenti, soprattutto in caso di interruzione di un scaricare in un numero elevato di sezioni. Strumenti come Google Cloud CLI hanno valori predefiniti bassi per il numero di sezioni che creano in modo da ridurre al minimo possibilità di impatti sulle prestazioni.

I download di oggetti suddivisi devono utilizzare sempre un checksum componibile rapido (CRC32C) per verificare l'integrità dei dati delle sezioni. Per eseguire il download di oggetti suddivisi, come gcloud CLI richiedono una versione compilata di crcmod on dalla macchina che esegue il download. Se il crcmod compilato non è disponibile, gcloud CLI esegue invece download di oggetti non suddivisi.

In che modo strumenti e API utilizzano i download di oggetti suddivisi

A seconda di come interagisci con Cloud Storage, l'oggetto segmentato i download potrebbero essere gestiti automaticamente per tuo conto. Questa sezione descrive il comportamento di download degli oggetti suddivisi per strumenti e fornisce informazioni su come modificarne il comportamento.

Console

La console Google Cloud non esegue i download di oggetti suddivisi.

Riga di comando

Per impostazione predefinita, gcloud storage cp attiva i download di oggetti suddivisi. Puoi controllare come e quando gcloud CLI esegue la suddivisione in sezioni l'oggetto viene scaricato modificando le seguenti proprietà:

  • storage/sliced_object_download_threshold: il totale minimo del file dimensioni per eseguire il download di un oggetto segmentato. Puoi disattivare tutte di download di oggetti suddivisi impostando questo valore su 0.

  • storage/sliced_object_download_max_components: la soglia massima il numero di sezioni da utilizzare nel download. Imposta 0 per nessun limite, in In questo caso il numero di sezioni è determinato esclusivamente storage/sliced_object_download_component_size.

  • storage/sliced_object_download_component_size: la dimensione di destinazione per ogni sezione di download. Questa proprietà viene ignorata se il totale è talmente grande che il download di sezioni di queste dimensioni richiede più sezioni del consentito, come impostato in storage/sliced_object_download_max_components.

Puoi modificare queste proprietà creando una configurazione con nome e applicando la configurazione per ogni comando utilizzando il flag a livello di progetto --configuration o per tutte i comandi gcloud CLI mediante Comando gcloud config set.

Non è richiesto spazio aggiuntivo su disco locale quando si utilizza gcloud CLI per eseguire i download di oggetti suddivisi. Se il download non va a buon fine prima del completamento, esegui di nuovo il comando per riprendere sezioni con errori. Sezioni scaricate correttamente prima della errori non vengono scaricati nuovamente quando riprovi, ad eccezione del caso in cui l'oggetto di origine è cambiato tra un tentativo di download e l'altro.

Gli oggetti scaricati temporanei vengono visualizzati nella directory di destinazione con il suffisso _.gstmp nel nome.

Librerie client

Java

Per ulteriori informazioni, consulta API Cloud Storage Java documentazione di riferimento.

Per eseguire l'autenticazione su Cloud Storage, configura Credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configura l'autenticazione per un ambiente di sviluppo locale.

Puoi eseguire i download di oggetti suddivisi impostando AllowDivideAndConquer su true. Ad esempio:

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

Per ulteriori informazioni, consulta API Cloud Storage Node.js documentazione di riferimento.

Per eseguire l'autenticazione su Cloud Storage, configura Credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configura l'autenticazione per un ambiente di sviluppo locale.

Puoi eseguire i download di oggetti suddivisi utilizzando downloadFileInChunks . Ad esempio:

/**
 * 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

Per ulteriori informazioni, consulta API Cloud Storage Python documentazione di riferimento.

Per eseguire l'autenticazione su Cloud Storage, configura Credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configura l'autenticazione per un ambiente di sviluppo locale.

Puoi eseguire i download di oggetti suddivisi utilizzando download_chunks_concurrently . Ad esempio:

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))

API REST

Sia l'API JSON che l'API XML supportano le richieste GET a intervalli, che significa che è possibile utilizzare entrambe le API per implementare il download di oggetti segmentati strategia.

Per evitare il danneggiamento dei dati dovuto all'oggetto di origine cambia durante il download, devi fornire il numero di generazione dell'oggetto di origine in ogni richiesta di download di una sezione dell'oggetto.