1

これは私に大きな頭痛を与えていたので、簡単な解決策を投稿しようと思いました. 私の問題は、Amazon の S3 用の Java API を使用しているときに、不可解なタイムアウトになる前に 50 個のオブジェクトしかダウンロードできなかったことです。コードは次のようになります。

int counter = 0;
AmazonS3Client s3 = new AmazonS3Client(propertiesFile);
while(objectList.isTruncated()){
for(S3ObjectSummary objectSummary : objectList.getObjectSummaries()){
    System.out.println(++counter);
    S3Object object = s3.getObject(new GetObjectRequest(bucketName, objectSummary.getKey()));
//do stuff
}
}

ちょうど 50 個のオブジェクトを実行してすべて正常に処理した後、タイムアウトします。

4

3 に答える 3

2

なんらかの理由で、主な問題は、s3 を として宣言したことAmazonS3Client s3です。次のようになっているはずです。

AmazonS3 s3 = new AmazonS3Client(propertiesFile);

他の誰かがこの問題に遭遇した場合に備えて。

于 2012-06-14T15:05:44.867 に答える
0

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)そのバケット/プレフィックス内のタプルの完全なリストを返します

また

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

そのコンテンツの合計サイズを返します (sum()式の最後に適用される追加の折りたたみ関数に注意してください ;-)

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

于 2014-06-05T12:33:50.900 に答える
0

ダウンロードするために getObject を呼び出している間は、InputStream を閉じていないことを願っています。これは getObject(); を呼び出すことでオプションになります。各オブジェクトを処理した後、InputStream を閉じる必要があります。

詳細については、こちらをご覧ください: http://docs.amazonwebservices.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/AmazonS3Client.html#getObject(com.amazonaws.services.s3.model.GetObjectRequest )

ありがとう

于 2012-06-20T05:55:43.377 に答える