Download objek menggunakan metode slice

Satu strategi untuk mendownload file berukuran besar disebut download objek irisan. Dalam download tersebut, permintaan GET dengan rentang dibuat secara paralel, sehingga menyimpan data dalam file tujuan sementara yang telah dialokasikan sebelumnya. Setelah semua irisan selesai didownload, file sementara akan diganti namanya menjadi file tujuan.

Download objek irisan dapat jauh lebih cepat jika kecepatan jaringan dan disk tidak membatasi faktor; namun, download objek irisan menyebabkan beberapa penulisan terjadi di berbagai lokasi pada disk, sehingga strategi download ini dapat menurunkan performa untuk disk dengan waktu pencarian yang lambat, terutama saat membagi download menjadi sejumlah besar irisan. Alat seperti Google Cloud CLI memiliki nilai default yang rendah untuk jumlah slice yang dibuatnya guna meminimalkan kemungkinan dampak performa.

Download objek irisan harus selalu menggunakan checksum yang dapat disusun dengan cepat (CRC32C) untuk memverifikasi integritas data irisan. Untuk menjalankan download objek irisan, alat seperti gcloud CLI memerlukan versi crcmod yang dikompilasi di mesin yang menjalankan download. Jika crcmod yang dikompilasi tidak tersedia, gcloud CLI akan menjalankan download objek bukan irisan.

Cara alat dan API menggunakan download objek irisan

Bergantung pada cara Anda berinteraksi dengan Cloud Storage, download objek irisan mungkin dikelola secara otomatis untuk Anda. Bagian ini menjelaskan perilaku download objek irisan untuk berbagai alat dan memberikan informasi tentang cara mengubah perilaku tersebut.

Konsol

Konsol Google Cloud tidak menjalankan download objek irisan.

Command line

Secara default, gcloud storage cp mengaktifkan download objek irisan. Anda dapat mengontrol cara dan waktu gcloud CLI menjalankan download objek irisan dengan mengubah properti berikut:

  • storage/sliced_object_download_threshold: Total ukuran file minimum untuk menjalankan download objek irisan. Anda dapat menonaktifkan semua download objek irisan dengan menetapkan nilai ini ke 0.

  • storage/sliced_object_download_max_components: Jumlah irisan maksimum yang akan digunakan dalam download. Tetapkan 0 untuk tanpa batas, yang dalam hal ini jumlah irisan hanya ditentukan oleh storage/sliced_object_download_component_size.

  • storage/sliced_object_download_component_size: Ukuran target untuk setiap download irisan. Properti ini diabaikan jika total ukuran file sangat besar sehingga download irisan dengan ukuran ini akan membutuhkan lebih banyak irisan dari yang diizinkan, seperti yang ditetapkan di storage/sliced_object_download_max_components.

Anda dapat memodifikasi properti ini dengan membuat konfigurasi bernama dan menerapkan konfigurasi per perintah menggunakan flag seluruh project --configuration atau untuk semua perintah gcloud CLI menggunakan perintah gcloud config set.

Tidak diperlukan ruang disk lokal tambahan saat menggunakan gcloud CLI untuk menjalankan download objek irisan. Jika download gagal sebelum selesai, jalankan kembali perintah untuk melanjutkan bagian yang gagal. Slice yang berhasil didownload sebelum kegagalan tidak akan didownload ulang saat Anda mencoba lagi, kecuali jika objek sumber telah berubah di antara upaya download.

Objek yang didownload sementara akan muncul di direktori tujuan dengan akhiran _.gstmp sebagai namanya.

Library klien

Java

Untuk mengetahui informasi selengkapnya, lihatDokumentasi referensi Cloud Storage Java API.

Untuk melakukan autentikasi ke Cloud Storage, siapkan Kredensial Default Aplikasi. Untuk informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

Anda dapat melakukan download objek irisan dengan menetapkan AllowDivideAndConquer ke true. Contoh:

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

Untuk mengetahui informasi selengkapnya, lihatDokumentasi referensi Cloud Storage Node.js API.

Untuk melakukan autentikasi ke Cloud Storage, siapkan Kredensial Default Aplikasi. Untuk informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

Anda dapat menjalankan download objek irisan menggunakan metode downloadFileInChunks. Contoh:

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

Untuk mengetahui informasi selengkapnya, lihatDokumentasi referensi Cloud Storage Python API.

Untuk melakukan autentikasi ke Cloud Storage, siapkan Kredensial Default Aplikasi. Untuk informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

Anda dapat menjalankan download objek irisan menggunakan metode download_chunks_concurrently. Contoh:

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 API

JSON API dan XML API mendukung permintaan GET dengan rentang, yang berarti Anda dapat menggunakan salah satu API untuk menerapkan strategi download objek irisan Anda sendiri.

Untuk melindungi dari kerusakan data akibat perubahan objek sumber selama download, Anda harus memberikan nomor pembuatan objek sumber dalam setiap permintaan download untuk irisan objek.