如何解决在 Azure 中访问大文件
我有一个 winforms 应用程序,用户在其中输入一些文本并尝试将其与以该输入开头的大文件(约 5GB)中的特定行(或行块)匹配。
这些行按字母顺序排序,因此我执行二进制搜索,并在不使用任何内存的情况下以 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,lineLength);
string line = Encoding.UTF8.GetString(buffer,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(而不是 FileStream.read()
会使用的操作系统/文件系统 API)实现。您可以通过使用一些噱头(例如 FUSE 或在处理“File Share”时无声发布的内容)挂载 blob/云存储来模拟文件系统,但支持和性能将非常值得怀疑,因为它是模拟和在幕后调用 REST API。
可以使用 REST API 中的范围选项来实现二进制搜索(需要随机访问文件)以读取 blob。
- 这是 REST API(对于 ADLS Gen2,如果您使用的是 Gen1 或 Blob,请找到合适的)
- 这里有一些关于如何从 blob 中的文件中read a byte range 的描述。
所有语言 SDK 都建立在这些 REST API 之上。可能是 C# SDK API 之一提供了一个包装器/参数来读取范围,因此您可以在代码中使用它。如果没有,那么您将不得不调用 REST API。
注意
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。