提高azure blob存储查询速度

时间:2011-05-11 01:29:02

标签: c# azure azure-storage azure-storage-blobs

我们目前在同一个Azure容器下有一个包含数千个文件的blob存储。我们的文件命名约定是这样的:

StorageName \队\工作小组\文件名

我正在编写一个工具,显示每个特定子团队的文件。代码获取Container的blob列表,然后为每个尝试与正确的Team \ Subteam匹配的blob列表(请参阅下面的示例代码)。

这有效,但速度极慢(因为我需要浏览所有文件以查看它们是否与特定的子团队匹配)。有没有办法提高查询的速度?我可以考虑优化,例如“查找与您正在寻找的团队匹配的第一个文件,然后在找到另一个团队以便提前退出​​时跟踪”,但这会假设BlobList已排序且无法修复最糟糕的情况。

不幸的是,目前不能在不同的容器下拆分文件。

以下是示例代码:

IEnumerable<IListBlobItem> blobs = blobContainer.ListBlobs(
    new BlobRequestOptions() 
    {
        UseFlatBlobListing = true, 
        BlobListingDetails = BlobListingDetails.Metadata 
    }).OfType<CloudBlob>();

foreach (var blob in blobs) {
var cloudy = blob as CloudBlob;

string blobTeamId = cloudy.Uri.Segments[2].Trim('/');
if (blobTeamId != teamId)
        continue;

//Do something interesting with the file

3 个答案:

答案 0 :(得分:18)

第一个解决方案 使用REST接口,您可以传入

http://somwhere.com/mycontainername/?restype=container&comp=list&delimiter=/&prefix=\Team\SubTeam

这将返回一个xml doc,只包含子团队“Folder”中的文件(我知道它不是一个文件夹,但它看起来像工具中的一个)

您可能需要生成共享访问签名才能访问它,您必须在URL的末尾标记它。

check out here

它显示您可以按blobname前缀过滤。

第二个解决方案 这可能更接近你想要的。如果您可以使用在azure sdk 1.3中更新的新存储客户端,那么现在可以使用

IEnumerable blobList = client.ListBlobsWithPrefix(“Team / SubTeam”);

客户端是CloudBlobClient的实例。

编辑 - 2013年11月18日 它似乎不再支持resttype作为参数,它应该是restype。这似乎在周末悄然发生。我已经更改了上面的url示例。

答案 1 :(得分:3)

只是更新......

您可以使用GetDirectoryRefence获取blob列表,然后列出blob ...

var subDirectory = blobContainer.GetDirectoryReference(String.Format("{0}/", folder));
return subDirectory.ListBlobs(false, BlobListingDetails.Metadata);

答案 2 :(得分:2)

你真的需要BlobListingDetails.Metadata吗?这导致下载了大量额外信息。我想你需要的只是名字