c# - 访问 Azure 中的大文件

标签 c# azure winforms azure-functions azure-blob-storage

我有一个 winforms 应用程序,用户输入一些文本并尝试将其与大文件(大约 5GB)中以该输入开头的特定行(或行 block )进行匹配。

这些行按字母顺序排序,因此我执行二分搜索,并在 log(n) 时间内识别特定行,而不使用任何内存。为了更轻松地在文件中导航,所有行都具有相同的大小(用空格填充)。

        using (var file = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
        {
            long left = 0;
            long right = fileLength / lineLength - 1;
            byte[] buffer = new byte[lineLength];
            bool found = false;

            while (left <= right)
            {
                var middle = left + (right - left) / 2;
                file.Position = middle * lineLength;
                int read = file.Read(buffer, 0, lineLength);
                string line = Encoding.UTF8.GetString(buffer, 0, read);
                if (line.StartsWith(term))
                {
                    found = true;
                    break;
                }
                else if (string.Compare(line, term) < 0)
                {
                    left = middle + 1;
                }
                else
                {
                    right = middle - 1;
                }
            }

            if (found)
            {
              ....

代码中唯一“昂贵”的操作是在文件的不同部分之间跳转的file.Position(总是在某行的开头),直到找到具体线路。但每次搜索的跳转次数不能超过 20 次(总行数的 log2)。 winforms 版本非常快,因为文件与可执行文件位于同一台机器中。

我想使用 azure 函数将此工具移至 azure。我想继续使用相同的 FileStream 逻辑来访问文件。 我怀疑 blob 存储不一定与 azure 函数位于同一台计算机中,因此 File.Read 可能是针对不同计算机的一些(缓慢的)http 调用,并使我的搜索速度慢了几个数量级。

我应该将大文件放在哪里,以便请求到达时可以快速搜索? 该文件是否可以位于执行 azure 函数的同一台计算机中?

更新

是否可以将该文件(嵌入资源)包含在我的 azure 函数项目中? 其大小限制是多少?

最佳答案

对 Blob(或其他云)存储的访问(读/写/...)通常作为 REST API 实现(而不是操作系统/文件系统 API,这就是 FileStream.read()) > 会使用)。您可以通过使用一些技巧(例如,如果您正在处理“File Share ”,则使用 FUSE 或静默发布的内容)来安装 blob/云存储来模拟文件系统,但支持和性能将非常值得怀疑,因为它是模拟并调用幕后 REST API。

<小时/>

可以使用 REST API 中的范围选项读取 blob 来实现相当于二分搜索(需要随机访问文件)。

  • 这是REST API (对于 ADLS Gen2,如果您使用的是 Gen1 或 Blob,请找到合适的)
  • 这里有一些关于如何 read a byte range 的说明从 blob 中的文件中取出。

所有语言 SDK 均构建在这些 REST API 之上。可能 C# SDK API 之一提供了一个包装器/参数来读取范围,因此您可以在代码中使用它。如果没有,那么您必须调用 REST API。

请注意

关于c# - 访问 Azure 中的大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66372693/

相关文章:

Azure:联合已被弃用,那么如何实现 'custom sharding' ?

azure - Microsoft Azure 上的 Hortonworks 沙盒失败

c# - 根据文本框的值动态更改标签的值 c# windows form

c# - 单选按钮作为一组在不同的面板中

c# - C#中位图图像的灰度变暗问题

c# - 在 Xamarin 中使用isolatedStorage

iis - 确定 AZURE 上的 W3SCV 名称

c# 如何在 c# 中显示名称并从组合框中插入值(名称的 ID)

c# - 如何调用 main 方法或重启应用程序控制台?

c# - 通用 Windows 平台 (UWP) 中的反射缺少属性