2016-04-03 32 views
0

我有一個包含數千個條目的s3bucket的問題,並且列表花費了太多時間。大s3bucket的AmazonS3Client.listObjects()問題

因爲它是現在,我檢索對象使用;

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); 
} 

隨着在LIstObjectsRequest對象指定文件夾通過下面的代碼

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

這個簡單的檢索需要的是巨大的(約7分鐘)的時間,所以我需要做的是限制的結果,在實際請求級別而不是限制在檢索s3bucket中的所有條目後。

有沒有辦法通過直接在「client.ListObjects(request)」調用中添加限制條件來提高速度?我可以在ListObjectsRequest對象或類似的東西中添加條件嗎?

在此先感謝您的反饋和想法!

回答

0

問題已解決。我通過將Maxkeys增加到更高的值(5000)而不是先前定義的2來增加返回值的數量。這就限制​​了我所理解的調用量,這是需要花費時間的。

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