8

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

存储名称\团队\子团队\文件名

我正在编写一个工具来显示每个特定子团队的文件。代码获取容器的 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
4

3 回答 3

18

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

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

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

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

在这里查看

它表明您可以按 blobname 前缀进行过滤。

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

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

其中 Client 是 CloudBlobClient 的一个实例。

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

于 2011-05-11T01:40:49.837 回答
3

只是更新...

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

var subDirectory = blobContainer.GetDirectoryReference(String.Format("{0}/", folder));
return subDirectory.ListBlobs(false, BlobListingDetails.Metadata);
于 2015-03-27T23:03:37.080 回答
2

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

于 2011-05-13T21:47:20.137 回答