我有一个215 my的csv文件,我已经解析并存储在自己的自定义对象中的核心数据中。问题是我的核心数据sqlite大约是260 my。csv文件包含我市公交系统(公交站、时间、路线等)的大约450万行数据。
我尝试修改属性,以便将表示停止时间的字符串数组存储为NSData文件,但出于某种原因,文件大小仍然保持在260 at左右。
我不能发布这么大的应用程序。我怀疑有人会想下载260 on的应用程序,即使这意味着他们有整个城市的交通时间表。
是否有任何方法来压缩或最小化所使用的存储空间(即使这意味着不使用核心数据,我也愿意听取建议)?
编辑:,我现在只想提供一个更新,因为我一直在难以置信地盯着文件大小。通过一些涉及字符串、索引和数据库规范化的巧妙操作,我成功地将压缩后的大小缩小到6.5MB或2.6MB。大约有105000个物体存储在核心数据中,这些数据包含了城市交通系统的全部细节。我现在快哭了,D':
发布于 2011-10-22 00:05:16
除非你原来的CSV是以一种非常愚蠢的方式编码的,它似乎不太可能不会小于100米,不管你怎么压缩它。对于一个应用程序来说,这仍然是非常大的。解决方案是将数据移动到web服务。您可能希望下载和缓存重要的部分,但是如果您谈论的是数百万条记录,那么从服务器获取似乎是最好的方法。此外,我不得不相信,过境系统不时变化,这将是令人沮丧的是,必须升级许多-10 s-MB的应用程序,每次有一个单一的停止调整。
我已经说过了,但实际上有些事情你可能会考虑:
,您应该对任何字符串进行规范化。看看CSV在许多行上复制的字符串值,
由于您最关心的是您的初始下载大小,并可能愿意扩展您的数据,以便更快的访问,您可以考虑非常特定领域的压缩。例如,在上面的讨论中,我提到了如何一次降低到2个字节。在许多情况下,您可能会将时间从上次的增量分钟存储到1字节(因为大多数时间都会以相当小的步数增加,如果它们是公交车和火车时刻表)。放弃数据库,您可以创建一个非常严格编码的数据文件,您可以在第一次启动时将其解压缩到数据库中。
您还可以使用特定于域的知识将字符串编码为较小的令牌。如果我对纽约地铁系统进行编码,我会注意到有很多字符串出现,比如“大道”、“道路”、“街道”、“东方”等等。我可能会将这些字符串编码为无法打印的ASCII,比如^A、^R、^S、^E等等。我可能会将"138街“编码为两个字节(0x8A13)。当然,这是基于我的知识,在纽约的地铁站里,è(0x8a)从来不会出现。这不是一个通用的解决方案(在巴黎,这可能是一个问题),但它可以用于高度压缩您有特殊知识的数据。在华盛顿特区这样的城市,我相信他们的最高编号的街道是38街,然后是一个4值的方向。所以你可以用两个字节编码,首先是一个“有编号的街道”标记,然后是一个位字段,象限是2位,街道数是6位。这种想法可能会大大缩小您的数据大小。
发布于 2011-10-21 23:43:40
您可能可以执行一些数据库规范化。
查找可能是冗余的内容或存储在多行中的相同值。您可能需要重新构造数据库,以便将这些重复的值(如果有的话)存储在单独的表中,然后通过id从原始行中引用。
发布于 2011-10-21 23:53:47
sqlite文件压缩得有多大?如果它是令人满意的小,最简单的事情是把它压缩,然后解压缩到NSCachesDirectory。
https://stackoverflow.com/questions/7856356
复制相似问题