2016-04-03 14 views
0

何千ものエントリを含むs3bucketに問題があり、リストに時間がかかりすぎます。Amazon S3Client.listObjects()に大きなs3bucketの問題があります

今のところ、私はオブジェクトを取得します。

コードの下
ListObjectsRequest request = new ListObjectsRequest 
       { 
        BucketName = "selectedbucket", 
        Prefix = "selectedfolder/", 
        MaxKeys = 2 
       }; 

通じLIstObjectsRequestオブジェクト内のフォルダの指定で

ListObjectsResponse response = client.ListObjects(request); 

foreach (S3Object entry in response.S3Objects.Where(p => p.Key.IndexOf(".mov") > 0 && DateTime.Parse(p.LastModified.ToString()) > DateTime.Now.AddDays(-1)).OrderByDescending(k => k.LastModified)) 
{ 
    Console.WriteLine(entry.Key + Environment.NewLine); 
} 

この単純な検索にかかる時間は膨大である(約7分)ので、私は何をする必要があるかの制限は、実際の結果でありますs3bucket内のすべてのエントリを取得してAFTERを制限するのではなく、リクエストレベルを使用します。

"client.ListObjects(request)"呼び出しで直接制限条件を追加することでこれをスピードアップする方法はありますか? ListObjectsRequestオブジェクトなどの条件を追加できますか?

フィードバックと考えをお寄せいただきありがとうございます。

答えて

0

問題を解決しました。私は、Maxkeysを前回定義した2の代わりにMaxkeys(5000)に増やすことで返される値の数を増やしました。これは、理解している限りの呼び出しの量を制限します。

ListObjectsRequest request = new ListObjectsRequest 
      { 
       BucketName = "selectedbucket", 
       Prefix = "selectedfolder/", 
       MaxKeys = 5000 
      }; 

パフォーマンスが7分から約2秒に向上しました。

+0

*これにより、通話量が制限されます。実際には「制限」ではなく、「正しく」制限されます。 'MaxKeys' *はあなたが渡す数以下の最大応答数に制限します。実際の最大値は1000までです。値が小さいほど同じ数のオブジェクトをフェッチするために、より多くのリクエストが必要です(時間がかかり、コストがかかります) 。 5000はおそらく単純に無視されます。これはS3よりも大きな値です。 'MaxKeys'を指定するのは実際には必要ありません。なぜなら、指定されていない場合のデフォルト値も最大1000であるからです。http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html –

+0

ありがとう明確化@ Michael-sqlbot – user3105469

関連する問題