簡體   English   中英

setFetchBatchSize似乎無法正常工作

[英]setFetchBatchSize doesn't seem to work properly

我就這個主題提出幾個問題,但仍然無法使其發揮作用。 我有一個核心數據,有10k +行的人名,我在tableview中顯示。 我希望能夠用每個字母搜索和更新表格。 這是非常遲鈍的。 正如我所建議的那樣,我觀看WWWDC '10核心數據演示並試圖實施

[request setFetchBatchSize:50];

似乎沒有用。 當我使用工具檢查核心數據時,它仍然顯示在加載tableview時仍有10k請求,當我搜索它時也獲得所有結果。 是否還需要做任何其他事情來設置批量大小或那些不會對我有幫助的東西。

唯一可行的方法是在搜索時將fetchlimit設置為100。 你認為這是一個很好的解決方案嗎?

提前致謝!

批量大小只是告訴它一次要獲取多少個對象。 這可能不會對你有所幫助。 讓我們考慮你的用例......

用戶鍵入“F”並告訴數據庫“Go找到所有以'F'開頭的名稱”,數據庫查看所有10k +記錄,找到以'F'開頭的記錄

然后,用戶鍵入'r',因此您告訴數據庫去查找以“Fr”開頭的所有記錄,並再次查看所有10k +記錄以找到以“Fr”開頭的記錄。

所有fetchBatchSize正在告訴它“嘿,當你在記錄中出錯時,立刻引進50,因為我可能還需要所有這些。” 這無助於限制您的搜索。

但是,將fetchLimit設置為100有助於一些因為數據庫開始搜索所有10k +記錄,但是一旦它有100條記錄,它就不必繼續查看其余的記錄,因為它已經填滿了它的請求。 它已經完成,並且一旦獲得滿足請求的100條記錄就停止搜索。

因此,您可以執行多項操作,具體取決於您的其他用例。

最簡單的方法是在您要搜索的字段上添加索引。 您可以在Xcode模型編輯器中設置它(指向Indexes的部分,在您可以在檢查器中命名實體的位置)。 這將允許數據庫在該字段上設置特殊索引,搜索速度會快得多。

其次,在您的初始請求之后,您已經有一個以'F'開頭的名稱數組,因此無需返回數據庫來詢問以'Fr'開頭的名稱如果它以'Fr'開頭,它也是以'F'開頭,你已經有了所有這些的NSManagedObject指針。 現在,您可以搜索您返回的陣列。

更好的是,如果你給它一個排序描述符,那么數組就會被排序。 因此,您可以在陣列上進行簡單的二進制搜索。 或者,如果您願意,可以使用相同的謂詞,並將其應用於結果數組而不是數據庫。

即使你不使用我剛剛討論過的結果修剪,我認為對該屬性進行索引也會顯着。

編輯

也許你應該運行樂器,看看你花多少時間在哪里。 而且,一個形式錯誤的謂詞可以使任何指數方案屈服。 代碼會有所幫助。

最后,考慮一下你帶入內存的元素數量。 CoreData不會對所有信息進行錯誤處理,但它會為數組中的所有內容創建shell。

如果你給它一個排序謂詞,

我不知道SQLLite如何在索引上實現其搜索,但是B-Tree具有復雜的logBN,所以即使在30k記錄上,這也不是很多搜索。 除非你有另一個問題,索引應該給你一個很大的改進。

獲得索引后,您不應該檢查所有記錄。 但是,您仍可能擁有非常大的數據集。 在那些上嘗試fetchBatchSize,因為它將限制獲取的記錄數,並為其余的創建代理。

您也可以調用countFetchRequext而不是executeFetchRequest來獲取項目數。 然后,您可以使用fetchLimit來限制您獲得的數字。

至於使用獲取結果控制器來完成所有這些......好吧,那個人必須知道記錄,所以它仍然必須進行搜索。

還有,一個地方看......你在做什么部分? 如果你有任何用戶定義的比較器(比如翻譯部分),那么每個記錄都會調用它。

因此,我想在改變指數后,我的重要建議是運行工具並真正研究它以確定你在哪里花時間。 應該很明顯。 這將有助於引導您走向真正的問題。

我敢打賭,由於某種原因,你仍然可以訪問所有元素......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM