json - 单点触控应用程序的大数据下载和本地处理和存储

标签 json sqlite xamarin.ios local-storage xamarin

这是一个针对 monotouch/xamarin 环境的更一般的软件架构问题。

这是我的问题:

我当前正在构建的应用程序在应用程序启动时下载了大约 30k 的 json 对象 (6mb)。然后数据存储在本地,因此所有屏幕都会进行本地数据库(sqlite)调用。

主要问题是执行下载所需的时间。目前,模拟器上的总时间约为 36 秒,分为以下任务:

  1. 下载约 10 秒
  2. 数据转换(json 到原生 obj)~ 16 秒
  3. 数据库插入 ~ 10 秒

这太长了,尤其是当我将它与应用商店中的类似应用程序进行比较时。我觉得我没有在这里做某事,或者不知道其他方法?以下是我实现的改进:

  1. gzip 响应 - 目前为 6mb,使用 gzip 后可降至约 1mb
  2. 安装了 ServiceStack.Text json 序列化程序,比 json.net 快约 2.5 倍(但 16 秒仍然太长)
  3. 扁平化的 json 响应,因此我可以在响应数组上执行 db.InsertAll() (无需额外的循环等)以获得更多机器人数据库导入(事务)
  4. 每天一次通话限制

现在,我想做的是在应用程序启动时显示本地数据并在后台初始化下载/更新程序。唯一的问题是下载所需的时间+新安装的应用程序不会有任何本地数据可显示...

我的问题是:

  1. mvc 4 api -> json Convert -> sqlite import 对于此类应用程序来说是一个好方法吗?如果没有 - 有什么替代方案?

我一直在考虑服务器在压缩响应中返回实际的 sqlite 文件,或者返回压缩的数据库命令...或者 sqlite 可能不适合这种类型的应用程序?有没有更好的本地存储替代方案? .net 序列化器/xml 等?

感谢您的所有建议!

最佳答案

我的建议是异步完成你的工作 - 你很幸运,因为 C# 使这变得非常容易。例如

  1. 开始后台下载;
  2. 在下载对象时对其进行处理(后台);
  3. 在处理对象时插入(背景)对象;
  4. 如果适用,请为您添加的每个 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/

相关文章:

sql - 我什么时候可以在 SQL 表中保存 JSON 或 XML 数据

c++ - SOCI 行集<行> 奇怪的错误

c# - DisplayAlert (Xamarin.iOS) 内的微调器

ios - Xamarin 调试器无法连接到 iPad

javascript - 将多个对象转换为对象数组

json - readValue() 不能与 TypeReference 一起使用

java - 如何将 JSON 数组转换为 Java 列表。我在用斯文森

ruby-on-rails - 无法启动 Rails 服务器 - sqlite3 适配器错误

android - 如何比较sqlite表的值和android中的json标签值

iphone - 有关 MonoTouch 使用情况的统计数据?