【发布时间】:2017-12-20 00:50:36
【问题描述】:
我们有一个过程需要创建一个带有几个表的 sql lite 数据库,这些表大约有 750k 条记录/100mb。它被上传到其他地方(Azure 存储 Blob)。我知道 Azure App 的磁盘 I/O 非常慢,在本地运行它需要几秒钟,它总是在 Azure 上超时。我尝试将WEBSITE_LOCAL_CACHE_OPTION 设置为always 并使用临时文件夹,但这没有帮助。
我曾考虑在内存数据库中使用 sql lite,但如果我想将其转换为在 azure 应用程序中速度较慢的字节数组(或流),似乎无法避免文件系统。理想情况下,最好的情况是访问内存数据库以流式传输到博客。
在 sql lite 或 azure app 服务中是否有任何调整可以让这在合理的时间内完成?
使用服务堆栈的 ormlite。这是一个例子:
using (var trans = dba.OpenTransaction( System.Data.IsolationLevel.ReadUncommitted))
{
dbLite.InsertAll(locs);
foreach (var s in sales)
{
dbLite.Insert<Sales>(s);
}
trans.Commit();
}
有趣的是,我把时间从不工作(10 分钟它写了 5mb,所以我知道它永远不会完成)减少到 4-5 分钟
dbLite.ExecuteSql("pragma page_size = 8192");
dbLite.ExecuteSql("pragma synchronous = OFF");
dbLite.ExecuteSql("PRAGMA journal_mode = OFF");
这与本地 1 秒进行比较。在我的场景中,设置为关闭的同步模式似乎最有帮助。
【问题讨论】:
-
您的 Azure 网站的应用服务计划/定价层是什么?您在哪里执行了有关创建 sqlite 数据库并插入大约 750k 记录/100mb、Web 应用程序或 Webjobs 下的请求的处理?
-
在 azure 上花费了多少时间,详细的错误跟踪是什么?对于 azure app service,请求有 230 秒的超时时间,你可以参考这个issue。此外,您可以使用
dbLite.InsertAll(sales)而不是迭代sales并插入销售数据以获得更好的性能。 -
我已经尝试插入所有 /etc。缓慢是由于磁盘 io 缓慢,因为我可以打开控制台并看到文件缓慢增加。我最终使用了挂火和后台线程。同步和日志设置为关闭需要 4-6 分钟,并且是 75mb 非压缩。
标签: sqlite azure azure-web-app-service ormlite-servicestack