2011-07-28 8 views
9

Azure 저장소 컨테이너에서 BLOB 수를 계산하는 가장 효율적인 방법은 무엇입니까?Azure 저장소 컨테이너에서 BLOB 수 얻기

는 지금은 아래의 코드 이외의 다른 방법을 생각할 수 없습니다

CloudBlobContainer container = GetContainer("mycontainer"); 
var count = container.ListBlobs().Count(); 

답변

10

당신이 뭔가를해야 할 것, 그래서 용기 카운트 메서드 또는 속성을 포함하지 않는 API 무엇 당신이 올렸습니다. 그러나 5,000 개의 항목이 반환 된 경우 (또는 반환 할 최대 #를 지정하고 그 수가 목록을 초과하는 경우) NextMarker를 처리해야합니다. 그런 다음 NextMarker를 기반으로 추가 통화를하고 개수를 추가합니다.

편집 : smarx 단위 : SDK에서 NextMarker를 처리해야합니다. API 수준에서 작업하는 경우 NextMarker를 처리하고 REST를 통해 List Blobs을 호출해야합니다.

또는 blob 삽입/삭제 (예 : wcf 서비스를 통해)를 제어하는 ​​경우 blob 컨테이너의 메타 데이터 영역을 사용하여 삽입 또는 삭제할 때마다 계산 된 캐시 된 컨테이너 수를 저장할 수 있습니다. 당신은 단지 컨테이너에 쓰는 동시성을 다룰 필요가있을 것이다.

+0

내가 확신 ListBlobs가 자동으로 따를거야 활동 창의 모양의 수를 관찰 폴더 통계 아이콘 enter image description here

  • 을 클릭 연속 토큰. (따라서이 기능을 사용하려면 NextMarker에 명시적인 작업을 수행 할 필요가 없다고 생각합니다.) – smarx

  • +0

    죄송합니다! API 수준에서 너무 많은 시간을 보내고 있습니다 ... :) –

    8

    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을 업데이트하지 않고 컨테이너를 수정 한 경우 다시 계산해야 함).하지만 신뢰할 수는 없습니다.

    +1

    이 방법은 호출을 병렬로 실행할 수있는 시스템에서 사용됩니다. 웹 API를 사용하면 마지막으로 업데이트 된 값을 중심으로 경쟁 조건이 발생합니다. 또 다른 접근법은 Azure Storage 테이블에 파일 이름을 인덱스로 저장하는 것입니다. –

    +0

    네이티브 카운트 방법이 없기 때문에 스토리지 테이블이 아닐 수도 있지만 "모든 항목 가져 오기"만 있습니다. 아마도 DocumentDB 테이블 또는 비교적 비싼 SQL 테이블 일 수 있습니다. –

    +0

    또는 blob과 테이블 엔티티가 동시성 문제를 탐지하기위한 ETags를 가지고 있기 때문에 파일 이름의 수나 목록과 함께 1 BLOB/엔티티를 가질 수 있습니다. –

    1

    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 
    
    0

    (우리는 유효한 $ 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 콜은 = 사실은 당신이 코드를 작성하지 않고 그냥 컨테이너에 얼마나 많은 모양 알고 싶다면

    +2

    올바르지 않습니다. 'list_blobs'의 상한선은 5,000입니다. – Shane

    2

    하는 가상 디렉터리를 사용하지 않는 경우 :

    은 같은 것입니다 푸른 저장의 파이썬 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;