הורדות של אובייקטים שמחולקים לפרוסות (sliced)

אחת האסטרטגיות להורדת קבצים גדולים נקראת הורדות של אובייקטים בפרוסות (slice). בהורדה כזו, נשלחות במקביל בקשות GET בטווח מסוים, והנתונים מאוחסנים בקובץ יעד זמני שהוקצה מראש. אחרי סיום ההורדה של כל הפרוסות, השם של הקובץ הזמני ישתנה לשם של קובץ היעד.

הורדות של אובייקטים בפרוסות יכולות להיות מהירות יותר באופן משמעותי אם אין הגבלה מבחינת מהירות הרשת והדיסק. עם זאת, הורדות של אובייקטים בפרוסות גורמות לפעולות מרובות של כתיבה במיקומים שונים בדיסק. לכן אסטרטגיית ההורדה הזו עלולה לפגוע בביצועים של דיסקים עם זמני איתור (seek times) איטיים, במיוחד כשמפצלים את ההורדה למספר פרוסות גדול. כדי לצמצם את הסיכוי לפגיעה בביצועים, מספר הפרוסות שכלים כמו Google Cloud CLI יוצרים יש ערכים נמוכים כברירת מחדל.

כשמורידים אובייקטים בפרוסות, אתם צריכים תמיד להשתמש בסיכום ביקורת (checksum) קומפוזבילי מהיר (CRC32C) כדי לוודא את תקינות הנתונים של הפרוסות. כדי לבצע הורדות אובייקטים בפרוסות, כלים כמו ה-CLI של gcloud דורשים גרסה מקומפלת של crcmod במכונה שמבצעת את ההורדה. אם לא תהיה גרסת crcmod שעברה הידור, ה-CLI של gcloud יוריד את האובייקטים ללא חלוקה לפרוסות.

איך להשתמש בהורדות של אובייקטים בפרוסות בכלים שונים ובממשקי API

בהתאם לאינטראקציה שלכם עם Cloud Storage, יכול להיות שהורדות של אובייקטים בפרוסות מנוהלות בשבילכם באופן אוטומטי. בקטע הזה מתוארת ההתנהגות של הורדת אובייקטים בפרוסות בכלים שונים, ומובא הסבר איך אפשר לשנות את ההתנהגות.

המסוף

אי אפשר להוריד אובייקטים בפרוסות במסוף. Google Cloud

שורת הפקודה

כברירת מחדל, gcloud storage cp מאפשר הורדות של אובייקטים בפרוסות. כדי לקבוע איך ומתי ה-CLI של gcloud יבצע הורדות של אובייקטים בפרוסות, אתם צריכים לשנות את המאפיינים הבאים:

  • storage/sliced_object_download_threshold: הגודל הכולל המינימלי של הקובץ להורדת אובייקט בפרוסות. אפשר להשבית את כל הורדות האובייקטים בפרוסות על ידי הגדרת הערך הזה ל-0.

  • storage/sliced_object_download_max_components: מספר הפרוסות המרבי לשימוש בהורדה. כדי שלא תהיה הגבלה, אתם צריכים להגדיר את הערך ל-0. במקרה כזה, מספר הפרוסות ייקבע אך ורק על ידי storage/sliced_object_download_component_size.

  • storage/sliced_object_download_component_size: גודל היעד של כל פרוסה להורדה. אם הקובץ גדול כל כך שהורדת הפרוסות בגודל שהוגדר תדרוש יותר פרוסות ממה שמותר לפי הגדרת storage/sliced_object_download_max_components, המערכת תתעלם מהמאפיין הזה.

כדי לשנות את המאפיינים האלה אפשר ליצור תצורה בעלת שם ולהחיל אותה בכל פקודה באמצעות הדגל --configuration ברמת הפרויקט או בכל הפקודות ב-CLI של gcloud באמצעות הפקודה gcloud config set.

כשמשתמשים ב-CLI של gcloud כדי להוריד אובייקטים בפרוסות, לא נדרש עוד מקום בכונן מקומי. אם ההורדה נכשלה לפני שהסתיימה, מריצים שוב את הפקודה כדי להמשיך את הורדת הפרוסות שלא ירדו. כשמבצעים ניסיון חוזר, תתבצע הורדה מחדש של פרוסות שכבר ירדו לפני שההורדה נכשלה רק אם אובייקט המקור השתנה בין ניסיונות ההורדה.

אובייקטים זמניים שירדו מופיעים בספריית היעד עם הסיומת _.gstmp בשם הקובץ שלהם.

ספריות לקוח

Java

למידע נוסף, קראו את מאמרי העזרה של Cloud Storage Java API.

כדי לבצע אימות ב-Cloud Storage, אתם צריכים להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

כדי להוריד אובייקטים בפרוסות, צריך להגדיר את AllowDivideAndConquer ל-true. לדוגמה:

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

למידע נוסף, קראו את מאמרי העזרה של Cloud Storage Node.js API.

כדי לבצע אימות ב-Cloud Storage, אתם צריכים להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

אפשר לבצע הורדות של אובייקטים בפרוסות באמצעות השיטה downloadFileInChunks. לדוגמה:

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

למידע נוסף, קראו את מאמרי העזרה של Cloud Storage Python API.

כדי לבצע אימות ב-Cloud Storage, אתם צריכים להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.

אפשר לבצע הורדות של אובייקטים בפרוסות באמצעות השיטה download_chunks_concurrently. לדוגמה:

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

API בפורמט JSON ו-API בפורמט XML תומכים בבקשות GET בטווח מסוים, כך שאתם יכולים להשתמש בכל אחד מממשקי ה-API האלה כדי להטמיע את האסטרטגיה שלכם להורדת אובייקטים בפרוסות.

כדי להגן מפני פגיעה בנתונים כתוצאה משינוי באובייקט המקור במהלך ההורדה, אתם צריכים לציין את מספר הגנרציה של אובייקט המקור בכל בקשת הורדה של פרוסה מהאובייקט.