Transferências de objetos segmentados

Uma estratégia para transferir ficheiros grandes chama-se transferências de objetos divididos. Numa transferência deste tipo, são feitos pedidos GET por intervalos em paralelo, armazenando dados num ficheiro de destino temporário pré-atribuído. Quando todas as divisões terminarem a transferência, o nome do ficheiro temporário é alterado para o nome do ficheiro de destino.

As transferências de objetos divididos podem ser significativamente mais rápidas se a velocidade da rede e do disco não forem fatores limitativos. No entanto, as transferências de objetos divididos fazem com que ocorram várias escritas em várias localizações no disco, pelo que esta estratégia de transferência pode degradar o desempenho dos discos com tempos de procura lentos, especialmente quando divide uma transferência num grande número de divisões. As ferramentas, como a CLI do Google Cloud, têm valores predefinidos baixos para o número de divisões que criam para minimizar a possibilidade de impactos no desempenho.

As transferências de objetos segmentados devem usar sempre uma soma de verificação componível rápida (CRC32C) para validar a integridade dos dados dos segmentos. Para fazer transferências de objetos segmentados, as ferramentas como a CLI gcloud requerem uma versão compilada do crcmod na máquina que está a fazer a transferência. Se o crcmod compilado não estiver disponível, a CLI gcloud executa transferências de objetos não divididos.

Como as ferramentas e as APIs usam transferências de objetos segmentados

Consoante a forma como interage com o Cloud Storage, as transferências de objetos segmentados podem ser geridas automaticamente em seu nome. Esta secção descreve o comportamento de transferência de objetos segmentados para diferentes ferramentas e fornece informações sobre como pode modificar o comportamento.

Consola

A Trusted Cloud consola não faz transferências de objetos segmentados.

Linha de comandos

Por predefinição, o gcloud storage cp permite transferências de objetos segmentados. Pode controlar como e quando a CLI gcloud executa transferências de objetos segmentados modificando as seguintes propriedades:

  • storage/sliced_object_download_threshold: o tamanho mínimo total do ficheiro para fazer uma transferência de objeto segmentado. Pode desativar todos os descarregamentos de objetos segmentados definindo este valor como 0.

  • storage/sliced_object_download_max_components: o número máximo de divisões a usar na transferência. Defina 0 para não ter limite. Neste caso, o número de fatias é determinado apenas por storage/sliced_object_download_component_size.

  • storage/sliced_object_download_component_size: o tamanho de destino para cada fatia de transferência. Esta propriedade é ignorada se o tamanho total do ficheiro for tão grande que a transferência de partes deste tamanho exigiria mais partes do que o permitido, conforme definido em storage/sliced_object_download_max_components.

Pode modificar estas propriedades criando uma configuração com nome e aplicando a configuração por comando através da --configuration flag ao nível do projeto ou para todos os comandos da CLI gcloud através do comando gcloud config set.

Não é necessário espaço adicional no disco local quando usa a CLI gcloud para fazer transferências de objetos segmentados. Se a transferência falhar antes da conclusão, execute o comando novamente para retomar as partes que falharam. As divisões transferidas com êxito antes da falha não são transferidas novamente quando tenta novamente, exceto no caso em que o objeto de origem tenha sido alterado entre as tentativas de transferência.

Os objetos transferidos temporários aparecem no diretório de destino com o sufixo _.gstmp no nome.

Bibliotecas cliente

Java

Para mais informações, consulte a documentação de referência da API Java do Cloud Storage.

Para se autenticar no Cloud Storage, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para bibliotecas de cliente.

Antes de executar exemplos de código, defina a variável GOOGLE_CLOUD_UNIVERSE_DOMAIN environment como s3nsapis.fr.

Pode fazer transferências de objetos segmentados definindo AllowDivideAndConquer como true. Por exemplo:

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

Para mais informações, consulte a documentação de referência da API Node.js do Cloud Storage.

Para se autenticar no Cloud Storage, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para bibliotecas de cliente.

Antes de executar exemplos de código, defina a variável GOOGLE_CLOUD_UNIVERSE_DOMAIN environment como s3nsapis.fr.

Pode fazer transferências de objetos segmentados através do método downloadFileInChunks. Por exemplo:

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

Para mais informações, consulte a documentação de referência da API Python do Cloud Storage.

Para se autenticar no Cloud Storage, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para bibliotecas de cliente.

Antes de executar exemplos de código, defina a variável GOOGLE_CLOUD_UNIVERSE_DOMAIN environment como s3nsapis.fr.

Pode fazer transferências de objetos segmentados através do método download_chunks_concurrently. Por exemplo:

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

APIs REST

Tanto a API JSON como a API XML suportam pedidos GET com intervalo, o que significa que pode usar qualquer uma das APIs para implementar a sua própria estratégia de transferência de objetos divididos.

Para se proteger contra a danificação de dados devido à alteração do objeto de origem durante a transferência, deve fornecer o número de geração do objeto de origem em cada pedido de transferência de uma parte do objeto.