Повышение скорости запросов к хранилищу BLOB-объектов Azure - PullRequest
7 голосов
/ 11 мая 2011

В настоящее время у нас есть хранилище больших двоичных объектов с тысячами файлов в одном контейнере Azure. Наше соглашение об именах файлов выглядит примерно так:

StorageName \ Команда \ SubTeam \ FileName

Я пишу инструмент, который отображает файлы для каждого конкретного подгруппы. Код получает список больших двоичных объектов для Контейнера, а затем для каждого из тех, которые он пытается сопоставить с правильным Team \ Subteam (пример кода см. Ниже).

Это работает, но очень медленно (потому что мне нужно просмотреть все файлы, чтобы увидеть, соответствуют ли они определенной подгруппе). Есть ли способ повысить скорость запроса? Я могу подумать об оптимизации, такой как «Найти первый файл, который соответствует команде, которую вы ищете, а затем отслеживать, когда вы находите другую команду, чтобы выйти из нее раньше», но это предполагает, что BlobList отсортирован и не будет исправлен. худший вариант развития событий.

К сожалению, в настоящее время разделение файлов по разным контейнерам не вариант.

Вот пример кода:

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

Ответы [ 3 ]

18 голосов
/ 11 мая 2011

1-й раствор С интерфейсом REST вы можете передать

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

и это вернет документ XML с только файлами в подгруппе «Папка» (я знаю, что это не папка, но в инструментах она похожа)

Вам может потребоваться сгенерировать подпись общего доступа, чтобы иметь к ней доступ, вы должны пометить это в конце URL.

проверить здесь

Где показано, что вы можете фильтровать по префиксу blobname.

2-й раствор Это, вероятно, ближе к тому, что вы хотите. Если вы можете использовать новый клиент хранилища, который был обновлен в Azure SDK 1.3, теперь вы можете использовать

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

Где Client является экземпляром CloudBlobClient.

РЕДАКТ. - 18 ноября 2013 г. похоже, что resttype больше не поддерживается как параметр, и он должен быть restype. Похоже, это произошло тихо на выходных. Я изменил пример URL выше.

3 голосов
/ 28 марта 2015

Просто обновление ...

Вы можете использовать получение списка BLOB-объектов с помощью GetDirectoryRefence, а затем список BLOB-объектов ...

var subDirectory = blobContainer.GetDirectoryReference(String.Format("{0}/", folder));
return subDirectory.ListBlobs(false, BlobListingDetails.Metadata);
2 голосов
/ 14 мая 2011

Вам действительно нужны BlobListingDetails.Metadata?это вызывает много дополнительной информации для загрузки.Я думаю, что все, что вам нужно, это имя

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...