Файловое хранилище Azure SMB медленно выводит список файлов в каталоге

У нас есть приложение, которое выводит список файлов в папке через Файлы Azure. Когда мы используем метод С#:

Directory.GetFiles(@"\\account.file.core.windows.net\xyz")

Это занимает около минуты, когда есть 2000 файлов.

Если мы используем CloudStorageAccount, чтобы сделать то же самое:

  CloudFileClient fileClient = storageAccount.CreateCloudFileClient();
  CloudFileDirectory directory = fileClient.GetShareReference("account").GetRootDirectoryReference().GetDirectoryReference("abc");
  Int64 totalLength = 0;
  foreach (IListFileItem fileAndDirectory in directory.ListFilesAndDirectories())
  {
    CloudFile file = (CloudFile)fileAndDirectory;
    if (file == null) //must be directory if null
      continue;

    totalLength += file.Properties.Length;
  }

Он возвращает все файлы, но занимает около 10 секунд. Почему такая большая разница в производительности?


person tank104    schedule 02.06.2016    source источник
comment
Привет, я пытаюсь работать с первым подходом, то есть с пространством имен system.io, и использую Directory.GetFiles или Directory.CreateDirectory, но нигде не смог найти ни одного полного примера/образца. Должны ли мы сделать какой-либо шаг перед этим? Как пройти аутентификацию в службе хранилища Azure?   -  person Milind Thakkar    schedule 18.09.2018
comment
@MilindThakkar, что касается управления объектами в хранилище файлов Azure, эта статья может оказаться полезной (Разработка файлов Azure с помощью .NET) docs.microsoft.com/en-us/azure/storage/files/   -  person Eddie Kumar    schedule 17.10.2018


Ответы (1)


При использовании Directory.GetFiles (API системных файлов) он фактически взаимодействует с хранилищем файлов Azure по протоколу SMB (версия 2.1 или 3.0 зависит от версии клиентской ОС). Однако при переключении на CloudStorageAccount он обращается к хранилищу файлов через REST. Если вы используете Wireshark, вы обнаружите, что протокол SMB будет иметь несколько запросов туда и обратно между клиентом и сервером из-за характера протокола. Причина, по которой хранилище файлов Azure поддерживает доступ как по SMB, так и по REST, заключается в том, что ваш устаревший код/приложение (которое использовалось для доступа к файловым ресурсам, размещенным на файловых серверах) теперь может взаимодействовать с файловым ресурсом в облаке без изменения кода.

Поэтому в вашем случае рекомендуется использовать вызов REST для доступа к хранилищу файлов Azure для повышения производительности.

person Jason Tang - MSFT    schedule 28.06.2016
comment
Танг: Привет, я пытаюсь работать с первым подходом, т. е. с пространством имен system.io и использую Directory.GetFiles или Directory.CreateDirectory, но я нигде не смог найти ни одного полного примера/образца. Должны ли мы сделать какой-либо шаг перед этим? Как пройти аутентификацию в службе хранилища Azure? - person Milind Thakkar; 18.09.2018