C# 提高azure blob存储查询速度
我们目前有一个blob存储,在同一Azure容器下有数千个文件。我们的文件命名约定如下: StorageName\Team\SubTeam\FileName 我正在编写一个工具来显示每个特定子团队的文件。代码获取容器的blob列表,然后为每个它试图匹配到正确的Team\Subteam的blob列表(参见下面的示例代码) 这是可行的,但速度非常慢(因为我需要遍历所有文件以查看它们是否与特定的子团队匹配)。有什么方法可以提高查询速度吗?我可以考虑一些优化,比如“找到第一个与您正在寻找的团队相匹配的文件,然后在发现其他团队提前退出时跟踪”,但这将假定BlobList已排序,不会修复最坏的情况 不幸的是,目前无法在不同容器下拆分文件 以下是示例代码: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列表(参见下面的示例代码) 这是可行的,但速度非常慢(因为我需要遍历所有文件以查看它们是否与特定的子团队匹配)。有什么方法可以提高查询速度吗?我可以考虑一些优化,比如“找到第一个与您正在寻找的团队相匹配的文
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排序的。