ผลลัพธ์การค้นหาขีดจำกัดขอบเขต

ฉันยังใหม่กับ Realm และฉันได้เห็นคำตอบนี้เกี่ยวกับการจำกัดการค้นหาในขอบเขตแล้ว (ในที่อื่นๆ อีกมากมาย ด้วย).

ปัญหาของฉันคือโค้ดต่อไปนี้ใช้เวลานานเกินไปในการโหลดข้อมูลลงในอาเรย์เมื่อปริมาณข้อมูลมีขนาดใหญ่:

RLMResults* rlm = [[Item class] objectsWithPredicate:predicate]; // this loads fast
NSArray* results = [rlm valueForKey:@"self"]; // this is slow

เท่าที่ฉันรู้ว่าฉันไม่สามารถจำกัดผลลัพธ์โดยใช้เพรดิเคตได้เช่นกัน ดังนั้นฉันจึงพยายามจำกัดผลลัพธ์เช่น ตัวอย่างนี้ ในเว็บไซต์ขอบเขต ดังต่อไปนี้:

RLMResults* rlm = [[Item class] objectsWithPredicate:predicate]; // this loads fast
NSMutableArray* results = [@[] mutableCopy];

for (NSInteger i = 0; i < 5; i++) {
    Item* item = rlm[i]; // only the first call (when i == 0) is slow here
    [results addObject:item];
}

ดังนั้นสิ่งที่น่าสนใจที่นี่คือเฉพาะการโทรครั้งแรกของ rlm[i] (rlm[0]) เท่านั้นที่ใช้เวลานาน และหลังจากนั้น (เมื่อฉัน > 0) การโทรจะทำงานอย่างรวดเร็ว

ฉันทำอะไรผิดหรือเปล่า? หรือมีวิธีใดบ้างที่จะโหลดข้อมูลจำนวนมากได้เร็วขึ้นหรือจำกัดผลลัพธ์?

ขอบคุณมาก!


person J. Doe    schedule 19.05.2016    source แหล่งที่มา


คำตอบ (1)


เช่นเดียวกับที่กล่าวไว้ในเอกสารของ Realm เนื้อหาของ RLMResults เป็นแบบโหลดแบบ Lazy Load มันถูกสร้างขึ้นเพื่อพยายามเลื่อน 'การโหลดล่วงหน้า' ทุกสิ่งออกไปจนกว่าจะมีความจำเป็นจริงๆ เมื่อคุณวนซ้ำแต่ละออบเจ็กต์และเพิ่มลงใน NSArray นั่นเป็นการบังคับให้แต่ละออบเจ็กต์โหลดอย่างเกียจคร้าน ซึ่งจะ (เข้าใจได้) ส่งผลให้เกิดประสิทธิภาพการทำงาน อาจเป็นไปได้ว่าแบบสอบถามเพรดิเคตจำนวนมากกำลังถูกดำเนินการอย่างเกียจคร้านเช่นกัน ซึ่งเป็นสาเหตุที่ทำให้คุณได้รับผลกระทบด้านประสิทธิภาพเมื่อคุณเข้าถึงออบเจ็กต์แรกในชุดผลลัพธ์ ไม่ใช่เมื่อคุณสร้างออบเจ็กต์ RLMResults

หากคุณคิดว่าประสิทธิภาพที่ได้รับจากการทำเช่นนี้เป็นสิ่งที่ยอมรับไม่ได้ คุณอาจต้องการลองใช้แนวทางอื่นในการดำเนินการนี้ ตัวอย่างเช่น แทนที่จะคัดลอกวัตถุไปยัง NSArray ให้ใช้วัตถุ RLMResults และติดตามเฉพาะวัตถุที่คุณต้องการโดยใช้วัตถุ NSRange นอกจากนี้ เนื่องจากเฉพาะการโหลดครั้งแรกเท่านั้นที่ช้า ฉันจึงขอแนะนำให้คุณลองเพิ่มประสิทธิภาพการสืบค้นภาคแสดงของคุณด้วย เช่น ตรวจสอบให้แน่ใจว่าแต่ละคุณสมบัติที่คุณกำลังค้นหานั้นถูกทำเครื่องหมายว่าจัดทำดัชนีแล้ว

หากแย่ลงไปอีก บางครั้งประสิทธิภาพการทำงานที่ยาวนานก็ช่วยไม่ได้ และหากเป็นเช่นนั้น คุณสามารถบรรเทาปัญหาการค้างของ UI ใดๆ ได้โดยการลดการโหลดลงในเธรดพื้นหลัง

ฉันหวังว่ามันจะช่วยได้!

person TiM    schedule 24.05.2016
comment
ขอบคุณสำหรับการตอบกลับ ฉันไม่คิดว่าการใช้ RLMResults จะใช้ได้ผล (ไม่พบตัวอย่างใด ๆ ที่ใช้มันเช่นกัน) และหาก Realm ไม่มีวิธีอื่นในการจำกัดผลลัพธ์ (หรือยัง?) ให้ปรับแบบสอบถามเพรดิเคตให้เหมาะสม (ไม่เสมอไป) เป็นไปได้) และการทำให้โหลดในเธรดพื้นหลังเป็นวิธีเดียวสำหรับฉันที่จะทำให้มันเร็วขึ้นและไม่ค้าง UI - person J. Doe; 30.05.2016
comment
ด้วยความยินดี! มีตัวอย่างและคำอธิบายบางส่วนของ RLMResults ในหน้าเอกสารของ Realm (โดยเฉพาะภายใต้ข้อความค้นหา: realm.io /docs/objc/latest/#queries) รวมถึงโค้ดตัวอย่าง มีการพูดคุยถึงการเพิ่มคุณสมบัติที่จำกัดในอดีต (github.com/realm/realm-cocoa /issues/2608) แต่มีการตัดสินใจว่าไม่มีเหตุผลที่แท้จริงที่จะเพิ่มกลไกที่ยากเช่นนั้น เนื่องจากมันไม่สมเหตุสมผลกับการใช้งานการโหลดแบบ Lazy Loading ของ Realm (เป็นเพียงเรื่องของ ไม่ วนซ้ำแต่ละวัตถุที่ส่งคืนใน RLMResults :) ) เย็น! ขอให้โชคดี! - person TiM; 31.05.2016
comment
ดังนั้นจึงไม่มีขีดจำกัดที่เป็นไปได้ ฉันจะทำเครื่องหมายว่าเป็นคำตอบแล้ว;) - person J. Doe; 31.05.2016
comment
เพื่อชี้แจงให้ชัดเจน... ไม่จำเป็นต้องแบ่งหน้าเพราะการโหลดแบบขี้เกียจมีประสิทธิภาพเพียงพอใช่ไหม - person Jules Lee; 07.09.2019
comment
ถูกต้อง! มีเพียง Realm เท่านั้นที่โหลดคุณสมบัติที่คุณเข้าถึงได้ และคุณสมบัติที่เข้าถึงในอดีตจะถูกเผยแพร่โดยอัตโนมัติเมื่อเวลาผ่านไป ดังนั้นจึงไม่จำเป็นต้องดำเนินการตรรกะการแบ่งหน้าใดๆ สำหรับผลลัพธ์การค้นหาที่ยาว - person TiM; 08.09.2019