提高azure blob存储查询速度

kro*_*lth 7 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
Run Code Online (Sandbox Code Playgroud)

Dav*_*ele 18

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

http://somwhere.com/mycontainername/?restype=container&comp=list&delimiter=/&prefix=\Team\SubTeam
Run Code Online (Sandbox Code Playgroud)

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

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

看看这里

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

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

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

客户端是CloudBlobClient的实例.

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