我正在尝试获取Azure中的blob名称列表,而我正在寻找使此操作速度更快的方法。在给定的子文件夹中,blob的数量可以超过150,000个元素。 blob的文件名是一个编码ID,这是我真正需要得到的,但如果有办法只查询元数据或元数据的单个字段,我可以将其存储为某种元数据。
我发现了以下简单的事情:
var blobList = container.ListBlobs(null, false);
从我的桌面运行可能需要60秒以上,并且在Azure中托管的VM上运行时通常需要大约15秒。这些时间基于一个空容器中125k blob的测试,并且在上传后几个小时,所以他们肯定有时间“解决”,可以这么说。
我尝试了多种变体并尝试使用ListBlobsSegmented,但它并没有真正帮助,因为该函数返回了许多我根本不需要的额外信息。我只需要blob名称,这样我就可以获得编码的ID来查看当前存储的内容和不存在的内容。
blob名称的查询和提取编码的Id在某种程度上是时间敏感的,所以如果我能在1秒内得到它,我会很高兴。如果我在本地存储文件,我可以在几毫秒内获得整个文件列表,但我必须使用Azure存储,因此这不是一个选项。
我能想到的唯一能够减少识别可用blob所需时间的是跟踪从给定文件夹添加或删除的blob的名称,并将其存储在单独的blob中。然后,当我需要知道该文件夹中的blob名称时,我会使用元数据而不是使用ListBlobs来读取blob。我想另一种方法是以类似的方式使用Azure表存储,但似乎我被迫缓存容器中给定文件夹的信息。
有没有更好的方法可以做到这一点,或者这通常是人们在一个文件夹中有数十万个blob时最终会做什么的?
答案 0 :(得分:1)
如前所述,Azure Blob存储是一个存储系统,无法帮助您索引内容。我们现在有Azure搜索索引器对上传到Azure Blob存储的内容编制索引,请参考https://azure.microsoft.com/en-us/documentation/articles/search-howto-indexing-azure-blob-storage/,您可以执行Azure搜索支持的所有功能,例如:列表,搜索,分页,排序等。希望这会有所帮助。