C# 提高azure blob存储查询速度

C# 提高azure blob存储查询速度,c#,azure,azure-storage,azure-storage-blobs,C#,Azure,Azure Storage,Azure Storage Blobs,我们目前有一个blob存储,在同一Azure容器下有数千个文件。我们的文件命名约定如下: StorageName\Team\SubTeam\FileName 我正在编写一个工具来显示每个特定子团队的文件。代码获取容器的blob列表,然后为每个它试图匹配到正确的Team\Subteam的blob列表(参见下面的示例代码) 这是可行的,但速度非常慢(因为我需要遍历所有文件以查看它们是否与特定的子团队匹配)。有什么方法可以提高查询速度吗?我可以考虑一些优化,比如“找到第一个与您正在寻找的团队相匹配的文

我们目前有一个blob存储,在同一Azure容器下有数千个文件。我们的文件命名约定如下:

StorageName\Team\SubTeam\FileName

我正在编写一个工具来显示每个特定子团队的文件。代码获取容器的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
IEnumerable blobs=blobContainer.ListBlobs(
新的BlobRequestOptions()
{
UseFlatBlobListing=true,
BlobListingDetails=BlobListingDetails.Metadata
}).of type();
foreach(blob中的var blob){
var cloudy=作为CloudBlob的blob;
字符串blobTeamId=cloudy.Uri.Segments[2].Trim('/');
if(blobTeamId!=teamId)
继续;
//用这个文件做些有趣的事情

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

http://somwhere.com/mycontainername/?restype=container&comp=list&delimiter=/&prefix=\Team\SubTeam
这将返回一个xml文档,其中只包含子团队“文件夹”中的文件(我知道它不是文件夹,但看起来像工具中的文件夹)

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

其中显示可以按blobname前缀进行筛选

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

IEnumerable blobList=client.ListBlobsWithPrefix(“团队/子团队”)

其中客户端是CloudBlobClient的实例

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

您真的需要BlobListingDetails.Metadata吗?这会导致大量额外信息被下载。我想您所需要的只是名称而已日期

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

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

看起来ListBlob确实是根据MSDN排序的。