我实现了一个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句柄(只有一个句柄)总是打开是否有任何缺点?
我猜这是老旧的冷启动问题。
在这个答案中看到其他(可能更便宜的)处理方法。