2014-05-08 41 views
1

我面臨的情況是,我需要將一個可能很大(20.000+)的數據集導入到核心數據中。數據以JSON格式從Web服務中檢索。至於導入它是一種簡單的更新或創建類型的東西,也代表了一個hierachichal結構,因此對於我設置父實體的每個實體(當然頂級除外)。目前這個過程運行得太慢,可能會佔用大量內存。所以我必須進行優化,並且我有關於這樣做的最佳實踐的問題。核心數據:導入大型數據集

首先,我使用一個單獨的線程與兒童NSManagedObjectContext導入,所以我的UI線程不會卡住。基本原則是工作。

首先,我想批量處理數據。可能最好的解決方案是隻解析對象的一部分JSON答案,然後處理它們。然後我會實現https://developer.apple.com/library/mac/DOCUMENTATION/Cocoa/Conceptual/CoreData/Articles/cdImporting.html中描述的查找或創建效率。

我的問題是:

  • 什麼會好的批處理大小呢? 1000?

  • 由於我需要爲每個實體查找並設置一個父實體,因此我的方法是在批處理沒有父級處理後的第二次迭代中執行此操作。這樣我可以爲父母做批量提取。這是一個好主意/有沒有更好的方法?

  • 每次批後,我會重置孩子MOC並保存在父母moc。這夠了嗎?我需要做更多嗎?

    [self.childmoc reset]; 
    dispatch_async(dispatch_get_main_queue(), ^(void) { 
        [self.moc save]; 
    }); 
    
  • 當前我通過AFNetworking加載數據,它能夠自動進行JSON解析。何時重構什麼是將接收到的答案拆分爲單獨文件(每批一個)而不破壞json對象的最佳方式? AFNetworking使用什麼JSON解析器(AFJSONResponseSerializer)?我也可以在加載文件時使用它嗎?

  • 我需要特別注意的任何缺陷?

感謝您的幫助!

+0

關於最優批量大小,你最好的選擇它來嘗試一下,看看。測試幾個,看看哪一個工作最快 – dandan78

回答

1

這只是我的兩分錢,但您的問題並不是將數據導入到Core Data中,而是將它導入到Core Data抽象的數據存儲中。

考慮到這一點,你可能有其他的選擇根據您具體的使用情況下(即如果你的數據導入在例如首次發射),如:

  • 不使用核心數據做進口,但直接上了sqlite。然後(重新)初始化核心數據堆棧,完成它的完成
  • 如果您控制該服務並且它不是一個公共API,那麼可以添加一個終點,讓您直接在種子.sqlite文件中進行流式處理。儘管如果您需要創建或更新,這可能不是最好的想法。再次,這取決於你的用例。

只是一個想法...

+0

感謝您的想法。不幸的是,它不僅是首次發佈的類型。此外,我將不得不直接與SQL中的關係等內核數據內核混淆,我想避免這種情況。 – patman