c# - Azure 文件存储 SMB 列出目录中的文件速度很慢

标签 c# azure azure-storage smb azure-files

我们有一个应用程序,可以通过 Azure 文件列出文件夹中的文件。当我们使用C#方法时:

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 秒。为什么性能差异这么大?

最佳答案

使用 Directory.GetFiles(系统文件 API)时,它实际上通过 SMB 协议(protocol)(v2.1 或 v3.0 取决于客户端操作系统版本)与 Azure 文件存储进行通信。但是,当切换到 CloudStorageAccount 时,它会通过 REST 与文件存储进行通信。如果您使用 Wireshark,您会发现由于协议(protocol)的性质,SMB 协议(protocol)将在客户端和服务器之间产生多个来回请求。 Azure 文件存储支持 SMB 和 REST 访问的原因是允许您的旧代码/应用程序(用于访问文件服务器托管的文件共享)现在可以与云中的文件共享通信,而无需更改代码。

因此,针对您的情况,建议使用 REST 调用来访问 Azure 文件存储以获得更好的性能。

关于c# - Azure 文件存储 SMB 列出目录中的文件速度很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37581971/

相关文章:

c# - 有没有办法将 blob 从本地存储模拟器复制到远程 azure 存储?

spring - 如何使用 Spring Batch 写入 Azure Blob?

c# - 查询没有分区键和行键的 azure 表

c# - 将图像上传到 SQL 数据库

c# - 如何使一个复选框使所有复选框在 Listview C# 中被选中

c# - SQL BulkCopy 与 OPENDATASOURCE 哪个更快

c# - 取消由 ASP.NET 启动的任务

css - WordPress 上的字体

azure - Power BI 不支持 DocumentDB 分区集合吗?

azure - 在 Azure 媒体播放器中关闭 'More Options'