Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 压缩/编码SQL命令以加快网络传输_Ios_Sql_Sqlite_Synchronization_Icloud - Fatal编程技术网

Ios 压缩/编码SQL命令以加快网络传输

Ios 压缩/编码SQL命令以加快网络传输,ios,sql,sqlite,synchronization,icloud,Ios,Sql,Sqlite,Synchronization,Icloud,我正在开发一个iOS应用程序,它将数据存储在sqlite3数据库中。每次插入、更新或删除操作都会在本地记录,然后推送到iCloud,运行应用程序的其他设备可以下载这些事务日志,并在其中执行SQL命令,以使所有运行应用程序的设备保持同步。这是非常好的工作 我现在正在研究优化流程,我发现记录整个SQL命令会导致大量冗余数据被推送到云中或从云中取出,这最终会导致更长的同步时间和更高的数据使用率 SQL查询是非常可预测的(应用程序中使用的insert、update和delete每种格式只有一种),因此我

我正在开发一个iOS应用程序,它将数据存储在sqlite3数据库中。每次插入、更新或删除操作都会在本地记录,然后推送到iCloud,运行应用程序的其他设备可以下载这些事务日志,并在其中执行SQL命令,以使所有运行应用程序的设备保持同步。这是非常好的工作

我现在正在研究优化流程,我发现记录整个SQL命令会导致大量冗余数据被推送到云中或从云中取出,这最终会导致更长的同步时间和更高的数据使用率

SQL查询是非常可预测的(应用程序中使用的insert、update和delete每种格式只有一种),因此我正在考虑使用编码/解码例程,该例程将压缩SQL命令以存储在事务日志中,然后将其从日志中解压缩以执行

我发现的字符串压缩方法似乎不太适合SQL查询,因此我设计了自己的:

  • 用于标识SQL命令类型的单字节
  • 表名和列名在应用程序的数组中索引,这些名称使用其在数组中的索引位置进行编码
  • 以制表符分隔的数字字符串,用于表示列组和以制表符分隔的值(例如,在values()子句中)
  • 编码的检查列和值(用于update或delete命令中的WHERE子句)
使用这种格式,我将一个186字节的示例查询压缩为78字节。这在数据传输速度和数据使用量方面具有明显的优势

我预见到的缺点是,对命令进行编码和解码需要在客户端进行更多的处理。我想知道是否有人做过类似的事情,有什么建议可以提供


为了更清楚地说明我的问题:一般来说,最好尽量减少同步的数据量,并增加客户解释这些数据的负担,还是只需按原样同步数据,让客户按原样使用就更好了?

我发布了我自己问题的答案,因为我有一些信息,可以为其他正在关注同样问题的人提供建议

我昨天花了一些时间在Objective C中编写SQL查询压缩和解压缩函数。这些函数使用了我在原始问题中详细介绍的方法,因此将查询的所有非数据部分(SQL命令[insert/update/delete]、表名和列名)减少到一个位数来表示每个查询,并删除所有剩余的SQL语法(关键字如“FROM”、空格、逗号、括号…)

我通过创建五条记录(启用和不启用查询压缩)进行了一些测试,以下是文件大小的结果:

完整SQL查询(未经修改记录到事务文件)

  • 压缩:747字节
  • 未压缩:1515字节
压缩SQL查询(使用我的自定义格式压缩到事务文件)

  • 压缩:673字节
  • 未压缩:785字节
正如您所看到的,最大的好处是使用这两种类型的压缩。对查询进行编码可实现约50%的压缩。与压缩未编码的查询相比,编码然后压缩查询可以实现约10%的压缩


我现在真正需要问自己的问题是,在从其他设备下载事务日志后,对查询进行编码、压缩、解压和解码是否值得额外的开销。在本例中,通过编码然后压缩事务日志,我总共只保存了74个字节。对于五个查询,每个查询平均节省14.8字节(与单独压缩相比)。每1000条记录只有14.4kb,这似乎并不多。

虽然您已经实现了约50%的压缩,但总体数据量相当小;当然,这可能只是你的例子,我不知道你的应用程序需要同步多少数据。另一个选项类似于zipcompression@Paulw11-谢谢你的回复。我没有考虑过使用zip压缩。将有许多查询需要同步,但数据值将非常小(例如,将行从0更新为1)。这就是为什么我想到将查询的最长部分(SQL语法本身和表/列名)缩减为尽可能短的值,并且只发送完整格式的变量本身。您认为压缩数据会导致更好的压缩,因为它也会压缩插入/更新的值吗?我想我可以同时做这两件事来获得更少的数据……我不知道压缩是否会提供更少的数据,但它应该能够在合理数量的文本上提供50%的数据。我之所以想到zip,是因为标准库随时可用,所以编码更少。鉴于大多数网络以数据包的形式传输数据,很有可能,即使将186字节减少到78字节,也完全不起作用。两者都很容易放入一个典型的包中。我怀疑你过度优化了。@Paulw11-谢谢你,我将研究zip选项。