Azure 저장소 컨테이너에서 BLOB 수를 계산하는 가장 효율적인 방법은 무엇입니까?Azure 저장소 컨테이너에서 BLOB 수 얻기
는 지금은 아래의 코드 이외의 다른 방법을 생각할 수 없습니다
CloudBlobContainer container = GetContainer("mycontainer");
var count = container.ListBlobs().Count();
Azure 저장소 컨테이너에서 BLOB 수를 계산하는 가장 효율적인 방법은 무엇입니까?Azure 저장소 컨테이너에서 BLOB 수 얻기
는 지금은 아래의 코드 이외의 다른 방법을 생각할 수 없습니다
CloudBlobContainer container = GetContainer("mycontainer");
var count = container.ListBlobs().Count();
당신이 뭔가를해야 할 것, 그래서 용기 카운트 메서드 또는 속성을 포함하지 않는 API 무엇 당신이 올렸습니다. 그러나 5,000 개의 항목이 반환 된 경우 (또는 반환 할 최대 #를 지정하고 그 수가 목록을 초과하는 경우) NextMarker를 처리해야합니다. 그런 다음 NextMarker를 기반으로 추가 통화를하고 개수를 추가합니다.
편집 : smarx 단위 : SDK에서 NextMarker를 처리해야합니다. API 수준에서 작업하는 경우 NextMarker를 처리하고 REST를 통해 List Blobs을 호출해야합니다.
또는 blob 삽입/삭제 (예 : wcf 서비스를 통해)를 제어하는 경우 blob 컨테이너의 메타 데이터 영역을 사용하여 삽입 또는 삭제할 때마다 계산 된 캐시 된 컨테이너 수를 저장할 수 있습니다. 당신은 단지 컨테이너에 쓰는 동시성을 다룰 필요가있을 것이다.
ListBlobs()를 사용하여 blob을 계산하고 약 400,000 개의 항목이있는 컨테이너에 대해 5 분 이상 잘 걸렸습니다.
컨테이너를 완전히 제어 할 수있는 경우 (쓰기가 발생할 때 제어 함) 항목을 제거하거나 삽입 할 때마다 컨테이너 메타 데이터에 크기 정보를 캐시하고 업데이트 할 수 있습니다.
static int CountBlobs(string storageAccount, string containerId)
{
CloudStorageAccount cloudStorageAccount = CloudStorageAccount.Parse(storageAccount);
CloudBlobClient blobClient = cloudStorageAccount.CreateCloudBlobClient();
CloudBlobContainer cloudBlobContainer = blobClient.GetContainerReference(containerId);
cloudBlobContainer.FetchAttributes();
string count = cloudBlobContainer.Metadata["ItemCount"];
string countUpdateTime = cloudBlobContainer.Metadata["CountUpdateTime"];
bool recountNeeded = false;
if (String.IsNullOrEmpty(count) || String.IsNullOrEmpty(countUpdateTime))
{
recountNeeded = true;
}
else
{
DateTime dateTime = new DateTime(long.Parse(countUpdateTime));
// Are we close to the last modified time?
if (Math.Abs(dateTime.Subtract(cloudBlobContainer.Properties.LastModifiedUtc).TotalSeconds) > 5) {
recountNeeded = true;
}
}
int blobCount;
if (recountNeeded)
{
blobCount = 0;
BlobRequestOptions options = new BlobRequestOptions();
options.BlobListingDetails = BlobListingDetails.Metadata;
foreach (IListBlobItem item in cloudBlobContainer.ListBlobs(options))
{
blobCount++;
}
cloudBlobContainer.Metadata.Set("ItemCount", blobCount.ToString());
cloudBlobContainer.Metadata.Set("CountUpdateTime", DateTime.Now.Ticks.ToString());
cloudBlobContainer.SetMetadata();
}
else
{
blobCount = int.Parse(count);
}
return blobCount;
}
이, 물론, 당신은 ITEMCOUNT/CountUpdateTime에게 용기가 수정 될 때마다 업데이트하는 것이 가정 : 여기에 컨테이너 방울 수를 반환 코드의 조각이다. CountUpdateTime은 경험적 세이프 가드입니다 (컨테이너가 CountUpdateTime을 업데이트하지 않고 컨테이너를 수정 한 경우 다시 계산해야 함).하지만 신뢰할 수는 없습니다.
이 방법은 호출을 병렬로 실행할 수있는 시스템에서 사용됩니다. 웹 API를 사용하면 마지막으로 업데이트 된 값을 중심으로 경쟁 조건이 발생합니다. 또 다른 접근법은 Azure Storage 테이블에 파일 이름을 인덱스로 저장하는 것입니다. –
네이티브 카운트 방법이 없기 때문에 스토리지 테이블이 아닐 수도 있지만 "모든 항목 가져 오기"만 있습니다. 아마도 DocumentDB 테이블 또는 비교적 비싼 SQL 테이블 일 수 있습니다. –
또는 blob과 테이블 엔티티가 동시성 문제를 탐지하기위한 ETags를 가지고 있기 때문에 파일 이름의 수나 목록과 함께 1 BLOB/엔티티를 가질 수 있습니다. –
PHP API와 getNextMarker를 사용하는 예제.
Azure 컨테이너의 총 blob 수를 셉니다. 오랜 시간이 걸립니다. 100000 개의 얼룩에 대해서는 약 30 초입니다.
from azure.storage import *
blob_service = BlobService(account_name='myaccount', account_key='mykey')
blobs = blob_service.list_blobs('mycontainer')
len(blobs) #returns the number of blob in a container
(우리는 유효한 $ ConnectionString을하고 $의 CONTAINER_NAME 있다고 가정) , 이전에 답변 한대로 다음과 같이 작동합니다.
CloudBlobContainer container = GetContainer("mycontainer");
var count = container.ListBlobs().Count();
그러나 가상 디렉터리를 사용하는 경우 위 코드 조각에 원하는 개수가 없을 수 있습니다.
예를 들어, blob이 다음과 유사하게 저장되는 경우 /container/directory/filename.txt 여기서 blob name = directory/filename.txt container.ListBlobs(). Count(); 얼마나 많은 "/ 디렉토리"가상 디렉토리를 가질 지 계산합니다. 가상 디렉터리 내에 포함 된 blob을 나열하려면 ListBlobs() 호출에서 useFlatBlobListing = true를 설정해야합니다.
CloudBlobContainer container = GetContainer("mycontainer");
var count = container.ListBlobs(null, true).Count();
참고 : ListBlobs() useFlatBlobListing 콜은 = 사실은 당신이 코드를 작성하지 않고 그냥 컨테이너에 얼마나 많은 모양 알고 싶다면
올바르지 않습니다. 'list_blobs'의 상한선은 5,000입니다. – Shane
하는 가상 디렉터리를 사용하지 않는 경우 :
은 같은 것입니다 푸른 저장의 파이썬 API으로$blobRestProxy = ServicesBuilder::getInstance()->createBlobService($connectionString);
$opts = new ListBlobsOptions();
$nblobs = 0;
while($cont) {
$blob_list = $blobRestProxy->listBlobs($container_name, $opts);
$nblobs += count($blob_list->getBlobs());
$nextMarker = $blob_list->getNextMarker();
if (!$nextMarker || strlen($nextMarker) == 0) $cont = false;
else $opts->setMarker($nextMarker);
}
echo $nblobs;
... 훨씬 더 비싼/느린 호출입니다 Azure Storage Explorer application을 사용할 수 있습니다.
내가 확신 ListBlobs가 자동으로 따를거야 활동 창의 모양의 수를 관찰 폴더 통계 아이콘
죄송합니다! API 수준에서 너무 많은 시간을 보내고 있습니다 ... :) –