4

Amazon S3にすべてのタイプのファイルを保存しています。Amazon S3 バケットでは、すべてのファイルが異なるフォルダーに保存されます。Amazon s3 にはフォルダーの概念がないことはわかっています。オブジェクトはキーによってのみ識別されます。「mydocs/personal/profile-pic.jpg」のようなキーを持つファイルを保存すると、2 つの親フォルダー (mydocs フォルダー内の個人フォルダー) がそこに作成されます。

Javaの「mydocs」のようなフォルダーのサイズを計算したい。以下のコードを使用して、バケットの合計サイズを計算しました。

public long calculateBucketSize(String bucketName) {
long totalSize = 0;
    int totalItems = 0;
    ObjectListing objects = listObjects(bucketName);
    do {
        for (S3ObjectSummary objectSummary : objects.getObjectSummaries()) {
            totalSize += objectSummary.getSize();
            totalItems++;
        }
        objects = listNextBatchOfObjects(objects);
    } while (objects.isTruncated());
    System.out.println("Amazon S3 bucket: " + bucketName + " containing "
            + totalItems + " objects with a total size of " + totalSize
            + " bytes.");

    return totalSize;
}

このメソッドは、バケットの合計サイズを返します。単一のフォルダーのサイズを計算したい。どんな助けでも大歓迎です。

4

5 に答える 5

1

Scala 開発者の場合、公式のAWS SDK for Javaを使用して、AmazonS3 バケットのコンテンツのフル スキャンとマップを実行する再帰関数です。

import com.amazonaws.services.s3.AmazonS3Client
import com.amazonaws.services.s3.model.{S3ObjectSummary, ObjectListing, GetObjectRequest}
import scala.collection.JavaConversions.{collectionAsScalaIterable => asScala}

def map[T](s3: AmazonS3Client, bucket: String, prefix: String)(f: (S3ObjectSummary) => T) = {

  def scan(acc:List[T], listing:ObjectListing): List[T] = {
    val summaries = asScala[S3ObjectSummary](listing.getObjectSummaries())
    val mapped = (for (summary <- summaries) yield f(summary)).toList

    if (!listing.isTruncated) mapped.toList
    else scan(acc ::: mapped, s3.listNextBatchOfObjects(listing))
  }

  scan(List(), s3.listObjects(bucket, prefix))
}

上記のカリーmap()化された関数を呼び出すには、作成済みの (そして適切に初期化された) AmazonS3Client オブジェクト (公式のAWS SDK for Java API リファレンスを参照)、バケット名、およびプレフィックス名を最初のパラメータ リストに渡すだけです。またf()、2 番目のパラメーター リストで各オブジェクトの概要をマップするために適用する関数を渡します。

例えば

val tuple = map(s3, bucket, prefix)(s => (s.getKey, s.getOwner, s.getSize))

(key, owner, size)そのバケット/プレフィックス内のタプルの完全なリストを返します

また

map(s3, "bucket", "prefix")(s => s.getSize).sum

そのバケット/プレフィックス コンテンツの合計サイズを返します

関数型プログラミングでモナドmap()によって通常アプローチするように、他の多くの関数と組み合わせることができます

于 2014-06-05T12:29:44.033 に答える
0

各レベルでフォルダーのサイズを取得したいと思います。たとえば、1 つのルート フォルダー R フォルダーと 2 つのサブ フォルダー S1.1-Folder、S1.2-Folder がある場合、S1.1-Folder にも 3 つのサブフォルダー S1.1.1-Folder、S1.1.2-Folder、S1 があります。 1.3 フォルダー。各フォルダーのフォルダーサイズが必要になりました

R-Folder (32MB)
|__S1.1-Folder (22MB)
|  |__S1.1.1-Folder (7MB)
|  |__S1.1.2-Folder (5MB)
|  |__S1.1.3-Folder (10MB)
|
|__S1.2-FOlder (10MB)

私は正しいですか?

ステータスが isCompleted であるかどうかにかかわらず、リスト フォルダーの詳細を保持し、各フォルダーを再帰的にスキャンする必要があります。内部フォルダーが正常に完了したら、対応する親でサイズを更新する必要があり、その親は対応する親に更新し、これはルートまで毎回続きます。

于 2013-04-17T09:16:21.133 に答える