每次读取文件与保存到核心数据
Posted
技术标签:
【中文标题】每次读取文件与保存到核心数据【英文标题】:Reading a file in every time vs saving to core data 【发布时间】:2015-04-18 21:19:05 【问题描述】:我有一个文字游戏,我的应用需要在应用开始之前加载一个包含超过 225,000 字 (2.6 MB) 的文本文件。所以换句话说,这个过程是在每次用户启动应用程序时完成的。我的问题是加载单词列表一次(用户第一次播放)然后将其保存到核心数据以便之后每次使用会更好吗?加载列表与读取列表相比,性能会显着提高吗?
在我看来,这很简单,保存到核心数据肯定是最好的方法。
我只是想看看其他人对这两个选项之间的比较有何看法。
【问题讨论】:
文件是本地存储还是远程存储? 文件本地存储在设备上。 然后将其复制到 CoreData 将使您的应用程序对单词所需的存储空间大致翻倍,因此这是一个不容忽视的考虑因素......但话虽如此......您可以分发您的应用程序预加载的 Core Data 数据库而不是文本文件... 这是一个有趣的想法,但由于它大约不到 3MB,我不觉得复制它会是一个大问题。我对它的性能方面更感兴趣。换句话说,我不希望以最快的速度为我的用户加载应用程序。 然后将 Core Data 数据库与您的应用程序一起分发,这两者都做得最好。 【参考方案1】:您的“不费吹灰之力”的答案确实是正确的。我无法想象你会出于任何有意义的原因将这些保存在内存中的场景。
我建议在您的应用程序包中包含一个预先填充的 Core Data 存储,并在首次启动时将此文件复制到应用程序沙箱。您仍然可以在开发过程中使用文本导入功能。
使用 NSFetchedResultsController,您可以说,以一种非常简单有效的方式从您的列表中生成一个真正随机的单词。内存和性能都不会成为问题。
【讨论】:
【参考方案2】:如果内存使用是一个问题,那么您可以使用mmap(2)
让操作系统决定是否将单词列表保留在内存中。内存映射文件允许内核丢弃单独的内存页面,然后在系统处于内存压力下时重新加载它们,但如果有足够的可用内存,则会将整个文件保留在内存中。
相比之下,如果您将文件读入内存,那么当系统遇到内存压力时,它将不得不写入要交换的页面,这样成本会更高。
【讨论】:
以上是关于每次读取文件与保存到核心数据的主要内容,如果未能解决你的问题,请参考以下文章