मेरे आईफोन एप्लिकेशन में Words
गुण word
, length
और language
गुणों के साथ एक इकाई है। दोनों अनुक्रमित हैं: सरल कोर डेटा फ़ेच बहुत धीमा है
मैंने सीडीटामोडेल और डेटाबेस को एक अलग आयातक एप्लिकेशन में कॉपी किया जहां इसे विभिन्न भाषाओं में लगभग 400k शब्दों के साथ prefilled मिला। मैंने SQLite फ़ाइल को देखकर आयात की पुष्टि की और फिर आईफ़ोन प्रोजेक्ट में प्रीफिल्ड डेटाबेस की प्रतिलिपि बनाई।
सबसे पहले मैंने सोचा कि (सरल) भविष्यवाणी समस्या है।
// Get word
NSLog(@"Start");
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Words" inManagedObjectContext:appDelegate.managedObjectContext];
[fetchRequest setEntity:entity];
NSError *error = nil;
NSArray *fetchedObjects = [appDelegate.managedObjectContext executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) {
//... error handling code
}
[fetchRequest release];
NSLog(@"End");
return fetchedObjects;
डेटाबेस में प्रविष्टियों की संख्या है:
2011-09-01 09:26:38.945 MyApp[3474:3c07] Start
2011-09-01 09:26:58.120 MyApp[3474:3c07] End
यहाँ क्या मेरी कोड लगता है कि है: लेकिन लाने का अनुरोध से विधेय हटाने के बाद भी, यह निष्पादन के लिए एक बहुत लंबा समय लगता है कोर डेटा के लिए एक समस्या?
संपादित: रूप gcbrueckmann और jrturton ने कहा, यह fetchBatchSize
स्थापित करने के लिए एक अच्छा सवाल है। लेकिन लाने समय अभी भी नाकाफी है:
2 एक विधेय सेट के साथ सेकंड:
NSPredicate * विधेय = [NSPredicate predicateWithFormat: @ "लंबाई ==% d और भाषा BEGINSWITH% @", wordLength, एलएनजी ]; [fetchRequest सेट प्रमाणीकरण: predicate];
:
7 बैच का आकार सेट के साथ सेकंड [fetchRequest setFetchBatchSize: 1];
1 एक दोनों विधेय और बैच आकार के साथ दूसरे सेट
वहाँ अभी भी एक और अड़चन है?
अपने विधेय में लंबाई से संभवतः अधिक प्रतिबंधात्मक भाषा, कभी कभी विधेय चेकों के आदेश के रूप में अच्छी तरह से चीज़ों को गति कर सकते हैं। उदाहरण के लिए यदि इस मामले में 60% शब्द आपके लंबाई मानदंडों को पूरा करते हैं लेकिन केवल 40% भाषा मानदंडों को पूरा करते हैं तो पहले भाषा की जांच करना बेहतर होगा। दूसरी बात यह हो सकती है कि आपको इसकी तेज़ी से आवश्यकता हो, तो इसे प्री-लोड किया जाना चाहिए और फिर स्मृति में एक सरणी फ़िल्टर करना सुनिश्चित करें कि आपका आईफोन ऐप इसे संभाल सकता है या नहीं। –
इस मामले में पहली क्वेरी पूर्णांक की तुलना कर रही है (इंडेक्सिंग इसे बहुत तेज़ कर देगा) और दूसरा एक स्ट्रिंग तुलना है (यहां तक कि एक अनुक्रमित स्ट्रिंग भी तेज़ी से नहीं जा रही है) - अगर क्वेरी की पुनरीक्षण में मदद मिली तो मुझे आश्चर्य होगा। हालांकि, इसे आज़माएं - मुझे यह देखने में दिलचस्पी होगी कि इससे मदद मिली है या नहीं! – deanWombourne
ओह, मैं इसका उल्लेख करना भूल गया: मैंने पहले ही भविष्यवाणी के आदेश को स्वैप करने की कोशिश की है, यह fetch को तेज नहीं करता है। – Norbert