2011-05-11 9 views
7

현재 Azure 컨테이너 아래에 수천 개의 파일이있는 BLOB 저장소가 있습니다. 나는 각각의 특정 subteam에 대한 파일을 표시하는 도구를 쓰고 있어요azure blob storage 쿼리 속도 향상

저장소 이름 \ 팀 \ SubTeam \의 파일 이름 : 우리의 파일 이름 지정 규칙은 다음과 같이한다. 이 코드는 컨테이너에 대한 얼룩의 목록을 가져오고, 그 다음 각각에 대해 올바른 Team \ Subteam과 일치 시키려고 시도합니다 (샘플 코드는 아래 참조).

이것은 작동하지만 매우 느립니다 (특정 하위 팀과 일치하는지 확인하려면 모든 파일을 검토해야하기 때문에). 쿼리 속도를 향상시킬 수있는 방법이 있습니까? "당신이 찾고있는 팀과 일치하는 첫 번째 파일을 찾은 다음 다른 팀을 찾아서 일찍 끝낼 때 추적하십시오"와 같은 최적화를 생각할 수 있습니다.하지만 BlobList가 정렬되어 수정되지 않을 것이라고 가정합니다. 최악의 시나리오.

불행히도 다른 컨테이너에서 파일을 분할하는 것은 현재로서는 옵션이 아닙니다. 당신이

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

를 전달할 수 있으며,이 하위에있는 파일 만있는 XML 문서를 반환합니다 REST 인터페이스와

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 
+0

listblobs는 실제로 MSDN http://msdn.microsoft.com/en-us/library/dd135734.aspx에 따라 정렬됩니다. – krolth

답변

18

1 솔루션 : 여기

샘플 코드 팀 "폴더"(폴더가 아니라 도구에있는 것처럼 보입니다.)

유전자가 필요할 수 있습니다. 공유 액세스 서명에 액세스 할 수 있도록 평가하여 URL 끝에 태그를 지정해야합니다.

check out here

은 당신이 blobname 접두사를 기준으로 필터링 할 수 있음을 보여준다 곳.

제 2 해결책 이것은 아마도 당신이 원하는 것에 더 가깝습니다. azure sdk 1.3에서 업데이트 된 새 저장소 클라이언트를 사용할 수 있다면 지금 사용할 수 있습니다.

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

여기서 Client는 CloudBlobClient의 인스턴스입니다.

편집 - 1811 년 12 월 1 일 resttype은 더 이상 매개 변수로 지원되지 않으며 restype이어야합니다. 주말 내내 조용히 일어난 것 같습니다. 위의 URL 예제를 변경했습니다.

2

정말 BlobListingDetails.Metadata가 필요합니까? 이로 인해 많은 추가 정보가 다운로드됩니다. 나는 당신이 필요로하는 모든이 이름을 그냥 업데이 트

3

...

당신은 GetDirectoryRefence 다음 목록의 모양을 사용하여 모양의 목록을 사용할 수 있습니다

...

var에 하위 디렉토리 = blobContainer.GetDirectoryReference 생각 (String.Format ("{0} /", folder)); return subDirectory.ListBlobs (false, BlobListingDetails.Metadata);