【发布时间】:2021-05-28 01:25:42
【问题描述】:
我有一个 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, 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函数的同一台机器上吗?
更新
是否可以在我的天蓝色函数项目中包含文件(嵌入式资源)? 它的大小限制是多少?
【问题讨论】:
-
如果您在 Linux 上运行 Functions,您可以挂载文件共享。如果这真的能给你带来好的表现,不知道docs.microsoft.com/en-us/azure/azure-functions/…
标签: c# azure winforms azure-functions azure-blob-storage