2016-08-03 67 views
1

目前我从容器中获取列表中的所有Blob,然后根据LastModified属性对其进行排序。如果容器中存在大量斑点,则会导致性能问题。从容器中检索最老的blob的最有效方法是什么?

IEnumerable<IListBlobItem> blobsList = _sourceBlobStorageClient.BlobContainer.ListBlobs(null, false); 

var blobItem = blobsList.Cast<CloudBlockBlob>().OrderBy(s => s.Properties.LastModified); 
+0

代替listblobs你可以使用异步版本ListBlobsSegmentedAsync(String,BlobContinuationToken),但是你需要对LastModified进行排序。 – TusharJ

回答

2

不,没有更好的方法来实现这一点。

0

根据您的描述,您担心在容器中存在大量斑点时从容器中检索最老斑点的性能问题。正如赵兴录所言,没有更好的办法可以做到这一点。根据我的经验,我们可以尝试下面的解决方法来提高性能。

由于blob的名称可能包含被读取blob的许多应用程序解释为文件夹的'/'或'\'字符,因此我们可以尝试使用此功能来提高性能。

的基本思路如下:

一)根据斑点的修改时间来存储格式为“{文件}/{每年}/{}一个月”的目录下的斑点;

b)使用与blob的Modified-time关联的前缀来避免列出容器中的所有blob。

请参考以下步骤,看看它是否可以帮助你。

  1. 可以按如下步骤设计您的blob:

    enter image description here

  2. 当你想要检索的最古老的斑点,你可以参考下面的代码:

var results = (from blob in container.ListBlobs(prefix: "docs/2016/1/", useFlatBlobListing: true) 
       orderby ((CloudBlockBlob)blob).Properties.LastModified 
       select blob).FirstOrDefault(); 

结果: enter image description here

希望它可以帮助你,请让我知道如果你有任何关于上述步骤的问题。

+0

Hi @Jambor,在我的场景中,blob名称是外部的,我们没有任何控制权。但是,这种方法当然看起来很棒。感谢您的建议。 – user2806597

0

嗨感谢您的回复。正如赵兴提到的,没有更好的办法。我通过引入容器作为分阶段容器来使用解决方法。因此,无论第一次调用中获取的斑点数量多少,我都会转移到这个分阶段的容器并从中处理它。使用这种方法,我可以节省listBlobs()调用,因此我也看到了性能的提高。

相关问题