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

时间:2013-06-20 10:31:38

标签: json sqlite xamarin.ios local-storage xamarin

对于monotouch / xamarin环境,这是一个更通用的软件架构问题。

这是我的问题:

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

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

  1. 下载~10秒
  2. 数据转换(json到native obj)~16秒
  3. db insert~10 sec
  4. 这太长了,特别是当我将它与appstore上的类似应用进行比较时。我觉得我没有在这里做某事,或者没有意识到另一种方式?以下是我实施的改进措施:

    1. gzip响应 - 目前为6mb,gzip下降到~1mb
    2. 安装了ServiceStack.Text json serialiser,比json.net快2.5倍(但仍然是16秒太长)
    3. 扁平的json响应,所以我可以在响应数组上执行db.InsertAll()(无需额外的循环等)以获得更多的robost db import(事务)
    4. 每天一次通话限制
    5. 现在,我想要做的是在应用程序启动时显示本地数据并在后台初始化下载/更新程序。唯一的问题是下载时间+新安装的应用程序将无法显示任何本地数据...

      我的问题是:

      1. 是mvc 4 api - > json convert - > sqlite导入这种类型的应用程序的好方法?如果不是 - 有哪些替代方案?
      2. 我一直在考虑服务器返回实际的sqlite文件,使用压缩响应或返回压缩的db命令......或者sqlite不适合这种类型的应用程序?是否有更好的本地存储替代方案? .net serializer / xml等?

        感谢你的所有建议!

1 个答案:

答案 0 :(得分:2)

我的建议是异步完成你的工作 - 你很幸运,因为C#非常容易。 E.g。

  1. 开始后台下载;
  2. 下载对象时处理(后台);
  3. 在处理时插入(背景)对象;
  4. 如果适用,请为您添加的每个X对象更新UI(来自主线程);
  5. 由于下载(主要是看注释)网络绑定,因此您的CPU将空闲几秒钟。考虑到您的下一步(处理)将受CPU限制,这是浪费时间。甚至更多,因为之后的步骤可能是I / O绑定(数据库)。

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

    注意#1: gzipped 响应下载速度会更快。 OTOH需要一些额外的(CPU)时间来在本地解压缩。它应该更快但值得测量两个选项(例如使用Apple的Instrument工具,它与Xamarin.iOS很好地配合使用)。

    注意#2: zip 文件作为响应,还需要额外的时间(解压缩)。这不是你想要在下载后按顺序执行的操作(但是你可以在下载时解压缩它)。