我有一个 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/