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 花费了太多时间的主要内容,如果未能解决你的问题,请参考以下文章

使用标量函数执行查询花费了太多时间

从 Sqlite 游标创建 Pojo 类花费了太多时间

查询花费了太多时间与恼人的性能[关闭]

与 SqlDataAdapter.Fill() 相比,DataTable.Load() 花费了太多时间

从服务器检索数据花费了太多时间

Image magick:在 linux 服务器上花费了太多时间