如何計算Bucket中某個Prefix下所有檔案的儲存大小?

更新時間:
Copy as MD

通過OSS的清單或者列舉檔案的功能,您可以統計指定Prefix(首碼或者目錄)下所有檔案的儲存容量。通過統計儲存容量,有助於您瞭解儲存資源的使用方式,為最佳化儲存成本和提升儲存效率提供支撐。

方式對比

方式

描述

使用情境

清單

周期性擷取BucketObject資訊及其中繼資料的資訊清單檔。支援掃描指定PrefixObject、清單內容支援自訂、例如只匯出Object大小和儲存類型等。資訊清單檔以CSV格式儲存。

  • BucketObject數量較多(例如100億),需要定期擷取Object列表資訊的情境,例如瞭解不同業務的空間使用方式。

  • 需要存檔某些Object中繼資料供後續使用

列舉檔案

通過ListObjects即時擷取BucketObject列表,可通過Prefix、最大返回數量等條件來靈活控制查詢的結果,適合特定條件下的快速查詢。

  • BucketObject數量較少(例如幾千個Object)

  • 需要頻繁查詢即時Object資訊的情境,例如檔案上傳後需要快速驗證檔案是否存在

使用清單

例如,您希望匯出Bucket內首碼(Prefix)為bill/的所有檔案的清單,並統計bill/首碼所有檔案的總儲存容量。

  1. 配置清單規則。

    1. Object Storage Service控制台的Bucket列表頁面,單擊目標Bucket。

    2. 在左側導覽列,選擇資料管理 > Bucket 清單

    3. Bucket 清單頁面,單擊建立清單

    4. 設定清單報告規則面板,按以下說明配置各項參數,其他參數保留預設配置,然後單擊確定

      參數

      說明

      規則名稱

      自訂清單任務的名稱,本樣本為inventory001。

      儲存清單 Bucket

      選擇當前Bucket名稱。

      清單報告匯出周期

      選擇每天

      清單內容

      選中Object 大小

      按首碼匹配

      設定為bill/

  2. 通過資訊清單檔統計bill首碼所有檔案的總儲存容量。

    1. 檔案清單頁面,找到Bucket名稱/清單ID/data/路徑下以csv.gz結尾的資訊清單檔。

    2. 單擊資訊清單檔右側的more > 下載,將檔案下載到本地路徑,並完成解壓。

    3. 統計檔案儲存體容量大小。

      開啟csv資訊清單檔,檔案中的C列資料總大小即為bill首碼所有檔案的總儲存容量,單位為位元組。

  3. (可選)刪除清單規則。

    • 設定清單報告匯出周期為每天,能夠滿足您快速擷取資訊清單檔的需求。在清單規則未被刪除前,OSS會按照清單規則每天產生資訊清單檔。資訊清單檔會產生儲存費用。為避免產生不必要的費用,如果您不需要頻繁擷取最新的資訊清單檔,建議您在首次產生資訊清單檔後,及時刪除相應的清單規則。

      Bucket 清單 頁面,找到目標清單(如 inventory001),單擊其操作列的 刪除

    • 如果您需要周期性頻繁擷取最新的資訊清單檔,則保留當前配置的清單規則。

列舉檔案

使用阿里雲SDK

以下提供常見SDK列舉指定Prefix下所有檔案的總儲存容量的範例程式碼。

Java

import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.*;
import java.util.List;
public class Demo {
    public static void main(String[] args) throws Exception {
        // Endpoint以華東1(杭州)為例,其它Region請按實際情況填寫。
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 填寫Endpoint對應的Region資訊,例如cn-hangzhou。
        String region = "cn-hangzhou";
        // 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // 填寫Bucket名稱,例如examplebucket。
        String bucketName = "examplebucket";
        // 指定Prefix。
        String keyPrefix = "bill/";
        // 建立OSSClient執行個體。
        // 當OSSClient執行個體不再使用時,調用shutdown方法以釋放資源。
        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        // 顯式聲明使用 V4 簽名演算法
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
        OSS ossClient = OSSClientBuilder.create()
                .endpoint(endpoint)
                .credentialsProvider(credentialsProvider)
                .clientConfiguration(clientBuilderConfiguration)
                .region(region)
                .build();
        // 初始設定檔案總大小變數。
        long totalSize = 0L;
        try {
            ObjectListing objectListing = null;
            do {
                // 列舉檔案。
                ListObjectsRequest request = new ListObjectsRequest(bucketName).withDelimiter("/").withPrefix(keyPrefix);
                if (objectListing != null) {
                    request.setMarker(objectListing.getNextMarker());
                }
                objectListing = ossClient.listObjects(request);
                List<String> folders = objectListing.getCommonPrefixes();
                for (String folder : folders) {
                    long folderSize = calculateFolderLength(ossClient, bucketName, folder);
                    totalSize += folderSize;
                    System.out.println(folder + " : " + (folderSize / 1024) + "KB");
                }
                List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
                for (OSSObjectSummary s : sums) {
                    totalSize += s.getSize();
                    System.out.println(s.getKey() + " : " + (s.getSize() / 1024) + "KB");
                }
            } while (objectListing.isTruncated());
            System.out.println("Total Size: " + (totalSize / 1024) + "KB");
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
    // 擷取指定Prefix下所有檔案的總儲存容量。
    private static long calculateFolderLength(OSS ossClient, String bucketName, String folder) {
        long size = 0L;
        ObjectListing objectListing = null;
        do {
            // MaxKey預設值為100,最大值為1000。
            ListObjectsRequest request = new ListObjectsRequest(bucketName).withPrefix(folder).withMaxKeys(1000);
            if (objectListing != null) {
                request.setMarker(objectListing.getNextMarker());
            }
            objectListing = ossClient.listObjects(request);
            List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
            for (OSSObjectSummary s : sums) {
                size += s.getSize();
            }
        } while (objectListing.isTruncated());
        return size;
    }
}

Python

# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# 填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。
# 填寫Bucket名稱,例如examplebucket。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')
# 指定Prefix。
prefix = 'bill/'
def calculate_storage_size(prefix):
    total_size = 0
    # 列舉以指定Prefix開頭的所有Object.
    for obj in oss2.ObjectIterator(bucket, prefix=prefix):
        total_size += obj.size  # 累加Object的大小。
    return total_size
if __name__ == "__main__":
    size = calculate_storage_size(prefix)
    print(f'Total size of objects with prefix "{prefix}": {size} bytes')

使用命令列工具ossutil

您可以使用ossutil查看某個prefix下所有檔案的總儲存容量。具體步驟,請參見du(擷取大小)

相關文檔