azure函数中FileStream句柄的开销



我实现了一个azure函数,在每个请求中,我从本地文件(大约100字节)读取内容,并返回响应。我根据查询字符串(fromPosition)读取文件的不同部分。

public class Reader
{
public static byte[] GetData(int fromPosition)
{
using(var fileStream = File.OpenRead("myLocalFilePath"))
{
byte[] data = new byte[100];
fileStream.Position = fromPosition;
fileStream.Read(data, 0, 100);
return data;
}
}
}

这段代码的问题是,打开文件并在每个请求中返回数据需要大约1秒。

我修改了代码以保持文件始终打开(删除using语句,静态FileStream被打开一次而不被处置),也使用lock来防止多个请求。

public class Reader
{
static object locker = new object();
static FileStream fileStream;
public static byte[] GetData(int fromPosition)
{
lock(locker)
{
if(fileStream == null)
fileStream = File.OpenRead("myLocalFilePath");
byte[] data = new byte[100];
fileStream.Position = fromPosition;
fileStream.Read(data, 0, 100);
return data;
}
}
}

此代码在第一个请求中大约花费1秒,但在所有后续请求中它立即返回(0毫秒)。所以我在速度上有了很大的提高,我的azure函数现在完成得很快,我想这对成本也有好处。

关于azure成本,保持FileStream句柄(只有一个句柄)总是打开是否有任何缺点?

我猜这是老旧的冷启动问题。

在这个答案中看到其他(可能更便宜的)处理方法。

最新更新