在 Core Data 中存储 400,000 条数据用于地铁路线查找是不是异常?

Posted

技术标签:

【中文标题】在 Core Data 中存储 400,000 条数据用于地铁路线查找是不是异常?【英文标题】:Is storing 400,000 data in Core Data for subway route-finding unusual?在 Core Data 中存储 400,000 条数据用于地铁路线查找是否异常? 【发布时间】:2015-06-24 13:44:28 【问题描述】:

我正在尝试制作一个地铁应用程序,它可以找到从车站到车站的最短路径。

我尝试了使用多个堆样本的 Dijkstra 算法来实际计算用户每次选择起点站和终点站时的最佳路线。

但我想知道是否最好将所有可能的路线存储在 Core Data 中,这样应用程序就不必每次都计算最佳路线,而是从 Core Data 中获取最佳路线信息

有 624 个车站。和 624 X 624 = 389,376 条从任何站点到任何站点的现有路径。

每个可能路线的信息将包含以下内容:

- starting station : String
- end station : String
- stations in-between : String 
- total time it takes in seconds : Double
- number of transfers : Int
etc. 

我的主要问题是:假设我已经有 389,376 个数据,如果我将所有 400,00 个数据都存储在 Core Data 中会占用太多磁盘内存吗?还是只是一个小问题。

我尽量避免使用 Dijkstra,因为考虑转移时间、转移偏好等需要花费大量时间。

【问题讨论】:

假设station : String 是站名,使用有序关系而不是“中间站”的串联名称可能是个好主意。应该稍微减小 db 大小,当然可以加快速度。其余的实际上取决于您的资源,您可以让用户从您的服务器下载预先计算的路线信息和/或在站点列表更新时重新计算设备上的路线。完全静态的数据库似乎不如你想支持用户偏好那么好。 谢谢。从没想过有序关系 【参考方案1】:

如果您真的想存储所有这些数据,我建议您使用 SQLite 而不是 CoreData 来正确管理您兑现的数据大小。为此目的有很好的包装 https://github.com/ccgus/fmdb

你可以估计你的数据库的大小

- starting station : String (average size about 20 bytes - one byte per char)
- end station : String (average size about 20 bytes)
- stations in-between : String  (average size about 20 bytes)
- total time it takes in seconds : Double (8 bytes)
- number of transfers : Int (4 bytes) 

总计:每行 72 字节 * 400 000 = 27,4 Mb

【讨论】:

既然 Core Data 使用 SQLite,为什么还要使用 SQLite 而不是 Core Data? 这里是回答您问题的链接drdobbs.com/mobile/ios-data-storage-core-data-vs-sqlite/… 简而言之,核心数据会产生很多上下文,如果不想占用大量空间可以使用sqlite。当然,您可以使用核心数据,但在空间方面大约要大 2 倍【参考方案2】:

不一定。我有几个应用程序,每个应用程序的磁盘容量为 1GB 到 11GB。您的使用量似乎低于 1GB。

作为参考,请检查您的 iPhone 首选项 -> 常规 -> 管理存储以了解其他应用的存储使用情况。

请考虑许多用户可能只有 16GB 的 iPhone。

【讨论】:

以上是关于在 Core Data 中存储 400,000 条数据用于地铁路线查找是不是异常?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 更新基于 ID 慢(150,000 条记录)

使用 Core Data 高效显示 100,000 个项目

如何将 Twitter ID 存储在 Core Data 对象中

在 Core Data Editor 中建模 JSON 结果

在 Redshift 中获取超过 100,000 条记录 [关闭]

Core Data 的独特价值