这是一个针对 monotouch/xamarin 环境的更一般的软件架构问题。
这是我的问题:
我当前正在构建的应用程序在应用程序启动时下载了大约 30k 的 json 对象 (6mb)。然后数据存储在本地,因此所有屏幕都会进行本地数据库(sqlite)调用。
主要问题是执行下载所需的时间。目前,模拟器上的总时间约为 36 秒,分为以下任务:
- 下载约 10 秒
- 数据转换(json 到原生 obj)~ 16 秒
- 数据库插入 ~ 10 秒
这太长了,尤其是当我将它与应用商店中的类似应用程序进行比较时。我觉得我没有在这里做某事,或者不知道其他方法?以下是我实现的改进:
- gzip 响应 - 目前为 6mb,使用 gzip 后可降至约 1mb
- 安装了 ServiceStack.Text json 序列化程序,比 json.net 快约 2.5 倍(但 16 秒仍然太长)
- 扁平化的 json 响应,因此我可以在响应数组上执行 db.InsertAll() (无需额外的循环等)以获得更多机器人数据库导入(事务)
- 每天一次通话限制
现在,我想做的是在应用程序启动时显示本地数据并在后台初始化下载/更新程序。唯一的问题是下载所需的时间+新安装的应用程序不会有任何本地数据可显示...
我的问题是:
- mvc 4 api -> json Convert -> sqlite import 对于此类应用程序来说是一个好方法吗?如果没有 - 有什么替代方案?
我一直在考虑服务器在压缩响应中返回实际的 sqlite 文件,或者返回压缩的数据库命令...或者 sqlite 可能不适合这种类型的应用程序?有没有更好的本地存储替代方案? .net 序列化器/xml 等?
感谢您的所有建议!
最佳答案
我的建议是异步完成你的工作 - 你很幸运,因为 C# 使这变得非常容易。例如
- 开始后台下载;
- 在下载对象时对其进行处理(后台);
- 在处理对象时插入(背景)对象;
- 如果适用,请为您添加的每个 X 对象更新 UI(从主线程);
由于下载(大部分情况下,请参阅注释)是网络绑定(bind)的,因此您的 CPU 将空闲很多秒。考虑到您的下一步(处理)将受 CPU 限制,这是浪费时间。更重要的是,因为后面的步骤可能会受到 I/O 限制(数据库)。
IOW,同时运行所有三个任务看起来是一个好主意,同时向应用程序用户提供进度反馈(显示数据或进度条)。
注意#1:压缩响应的下载速度会更快。 OTOH 需要一些额外的(CPU)时间来本地解压缩。它应该更快,但值得衡量这两个选项(例如使用 Apple 的 Instrument 工具,它与 Xamarin.iOS 配合良好)。
注意#2:zip 文件作为响应,也需要额外的时间(解压缩)。这不是您希望在下载后按顺序执行的操作(但您可以在下载时将其解压缩)。
关于json - 单点触控应用程序的大数据下载和本地处理和存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17211355/