Core Data 花费了太多时间
Posted
技术标签:
【中文标题】Core Data 花费了太多时间【英文标题】:Core Data takes too much time 【发布时间】:2015-06-01 09:18:51 【问题描述】:我有大约 200,000 个四个字母的单词,我想在我的应用程序中使用它们。我不想在我的应用程序中将其用作 CSV 文件。所以我现在使用核心数据。现在,我只是第一次在应用程序启动时将所有这些值加载到核心数据中。我会在一段时间后检索这些值。
所以这个过程时间太长了,我想超过20秒。我只想访问一个单词,我也只想知道核心数据中是否已经存在一个单词,除了循环遍历整个数组之外,还有其他方法吗?
简单地说,我想检查一个单词是否存在于核心数据中,我也想通过整数索引访问一个单词,我不想遍历所有对象。有没有其他办法。?我想在几分之一秒内完成此操作。我应该如何加载 20 万字。?在我的应用程序中,从 CSV 读取需要 2 分钟以上。将字符串数组导入核心数据有什么建议吗?
这是我在项目中使用的代码。
// Save it into CoreData
func saveName()
//1 Getting AppDelegate
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let managedContext = appDelegate.managedObjectContext!
//2 Fetching Entity Description by corresponding entityName
let entity = NSEntityDescription.entityForName("Content", inManagedObjectContext: managedContext)
let tempManagedObject = NSManagedObject(entity: entity!, insertIntoManagedObjectContext:managedContext)
//3 Setting Values for managedObject
for input in self.fourLetterWords
tempManagedObject.setValue(input, forKey: self.kMainAttributeName)
//4
var error: NSError?
if !managedContext.save(&error)
println("Could not save \(error), \(error?.userInfo)")
//MARK: - Showing Values From Core Data
func showOutput()
var myArray : Array<String> = []
//1
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let managedContext = appDelegate.managedObjectContext!
//2
let fetchRequest = NSFetchRequest(entityName: "Content")
//3
var error: NSError?
let fetchedResults =
managedContext.executeFetchRequest(fetchRequest,
error: &error) as! [NSManagedObject]?
if let results = fetchedResults
for inputObject in results
if let value : String = inputObject.valueForKeyPath(self.kMainAttributeName) as? String
myArray.append(value)
else
println("Could not fetch \(error), \(error!.userInfo)")
【问题讨论】:
什么是十万,阿尔文?对于您的任务,您应该使用数组,而不是数据库。 @gnasher729:不是数组,是集合。 Alvin:如果你使用核心数据,也要熟悉谓词。 10 万意味着 10 万。 @vikingosegundo 我应该如何加载 20 万字。?在我的应用程序中,从 CSV 读取需要 2 分钟以上。将字符串数组导入核心数据有什么建议吗? 我同意,将单词加载到集合中可以更快地匹配。您甚至不需要 CSV - 只需一个每行一个单词的文件就可以了。显示您用于加载文本文件的代码,这需要两分钟 - 读取不到一兆字节应该不会花费那么长时间 【参考方案1】:你需要跳过循环的最重要的方法是:-
1 .filteredArrayUsingPredicate:
要搜索使用这个:-
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY SELF CONTAINS %@", search];
只要通过这个Apple doc,它一定会帮助你。
【讨论】:
【参考方案2】:在我的应用中,从 CSV 读取需要超过 2 分钟。
这听起来不对。我构建了一个包含 200,000 个 4 字母单词的文件。在我的 iPhone 6 上,将其读入内存,用逗号分隔平均需要 0.51 秒。
文件:
xgnu,dkiw,reff,iebs,qhdh,eqeb,osxr,stac,qiaa,fliq,pmhs,zllt,…
我重复了这个任务 10 次
var array = Array<Double>()
for i in 0..<10
let bundle = NSBundle.mainBundle()
let path = bundle.pathForResource("words", ofType: "csv")
var text = String(contentsOfFile: path!, encoding: NSUTF8StringEncoding, error: nil)!
let start = NSDate()
self.allWords = text.componentsSeparatedByString(",")
let stop = NSDate()
let duration = stop.timeIntervalSinceDate(start)
array.append(duration)
let total = array.reduce(0, combine: $0 + $1)
let maxDuration = array.reduce(-Double.infinity, combine: max($0, $1) )
let minDuration = array.reduce(Double.infinity, combine: min($0, $1) )
let average = total / Double(array.count)
println("duration: \(total), average: \(average), min \(minDuration), max: \(maxDuration)")
结果:
duration: 5.14537298679352, average: 0.514537298679352, min 0.495729029178619, max: 0.524932980537415
【讨论】:
以上是关于Core Data 花费了太多时间的主要内容,如果未能解决你的问题,请参考以下文章