大数据下载和本地处理和存储的单键应用程序



这是monotouch/xamarin环境中更普遍的软件架构问题。

我的问题是:

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

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

    下载~ 10秒
  1. 数据转换(json到本机obj) ~ 16秒
  2. 数据库插入~ 10秒

这太长了,特别是当我把它和appstore上的类似应用程序比较时。我觉得我在这里做的事情不对,或者没有意识到另一种方式?以下是我实现的改进:

  1. gzip响应-当前为6mb,使用gzip它将下降到~ 1mb
  2. ServiceStack安装。文本json序列化器,大约比json.net快2.5倍(但仍然16秒太长)
  3. 扁平json响应,因此我可以在响应数组上执行db. insertall()(没有额外的循环等)以获得更多的robost db import (transactions)
  4. 每天一次呼叫限制

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

我的问题是:

  1. 是mvc 4 api -> json转换-> sqlite导入这种类型的应用程序的好方法?如果不是,还有什么替代方案?

我一直在想服务器返回实际的sqlite文件,而不是在压缩响应,或返回压缩db命令…或者sqlite不适合这种类型的应用程序?本地存储有更好的替代方案吗?.net序列化器/XML等?

谢谢你的建议!

我的建议是异步地做你的工作——你很幸运,因为c#使这非常容易。例如

  1. 启动后台下载;
  2. 在对象被下载时处理(后台);
  3. 在对象被处理时插入(背景)对象;
  4. 如果可以的话,为你添加的每个X对象更新UI(从主线程);

由于下载是(大部分,请注意)网络绑定的,那么您的CPU将空闲许多秒。考虑到您的下一步(处理)将受到CPU限制,这是浪费时间。更重要的是,后面的步骤可能是I/O绑定(数据库)。

现在看起来像是一个好主意,同时运行所有三个任务,同时向应用程序用户提供进度反馈(显示数据或进度条)。

注释#1:gzip的响应将下载得更快。在本地解压缩需要一些额外的(CPU)时间。它应该更快,但值得衡量这两个选项(例如使用苹果的Instrument工具,它与Xamarin.iOS很好地配合使用)。

注释#2:zip文件作为响应,也需要额外的时间(解压缩)。这不是您希望在下载后依次执行的操作(但是您可以在下载时解压缩它)。

最新更新