CloudBlobContainer.ListBlobs() -使用ToList()来减少交易成本
本文关键字:交易 ToList ListBlobs 使用 CloudBlobContainer | 更新日期: 2023-09-27 18:10:14
我有两个代码示例:
var container = new CloudBlobContainer("address");
var blobs = container.ListBlobs();
foreach (var blob in blobs)
{
//Do somthing
}
和this:
var container = new CloudBlobContainer("address");
var blobs = container.ListBlobs().ToList();
foreach (var blob in blobs)
{
//Do somthing
}
第二个例子在"事务方面"有什么优势吗?
在每个示例中,对blob存储进行了多少事务处理?
Edit:这个问题似乎是参考了Martin Ingvar Kofoed Jensen的一篇博客文章。这个问题和那个问题的区别是对.Where(...).SingleOrDefault()
的调用。因为LINQ是惰性求值的,在Container.ListBlobs()
阶段,它仍然是IEnumerable
,还没有调用REST API(没有检索到数据)。一旦出现结果操作(如ToList()
或SingleOrDefault()
),就下载数据。由于在以下代码中对循环中的惰性列表调用了非惰性操作,因此每次循环迭代都会产生一个事务:
foreach (string filePath in allFilesInStartFolder)
{
string fileHash = GetFileHashFromCache(filePath, lastSync);
/* Checking for added files */
var blob = blobs.Where(b => b.LocalPath == filePath).SingleOrDefault();
// ^^ This is a non-lazy op on a lazy evalution, so it causes a REST call.
....
}
关于实际编写的问题:两个代码片段将引发单个事务(最多5,000 blobs)。我在LinqPad/Fiddler中测试了这两个代码片段,我只看到一个API调用来生成blob列表(将我们的存储名称替换为{mystore}):
https://{mystore}.blob.core.windows.net/
{mystore}?restype=container&comp=list&delimiter=%2F&timeout=90
根据List Blobs REST API的文档,一次调用可以返回多达5,000个结果。因此,如果您想列出整个容器中的所有blobs,则最多需要(# blobs/5000)个事务。