Hasil kueri batas ranah

Saya baru mengenal Realm, dan saya sudah melihat jawaban ini tentang membatasi kueri realm (di banyak tempat lain juga).

Masalah saya adalah kode berikut memakan waktu terlalu lama untuk memuat data ke dalam array ketika jumlah data bertambah besar:

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

setahu saya saya tidak bisa membatasi hasil menggunakan predikat juga, jadi saya mencoba membatasi hasil seperti contoh ini pada website realme, sebagai berikut:

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];
}

jadi yang menarik di sini adalah hanya panggilan pertama rlm[i] (rlm[0]) yang memakan waktu lama, dan setelahnya (saat i > 0) panggilan tersebut bekerja dengan cepat.

Apakah saya melakukan sesuatu yang salah? atau adakah cara untuk memuat data dalam jumlah besar dengan lebih cepat atau membatasi hasilnya?

Terima kasih banyak!


person J. Doe    schedule 19.05.2016    source sumber


Jawaban (1)


Seperti yang tertulis di dokumentasi Realm, konten RLMResults dimuat dengan lambat. Itu dibuat untuk mencoba dan menunda 'pra-pemuatan' apa pun sampai benar-benar diperlukan. Saat Anda mengulang setiap objek dan menambahkannya ke NSArray, hal itu memaksa setiap objek dimuat dengan lambat, yang (dapat dimengerti) akan menghasilkan peningkatan kinerja. Mungkin juga sebagian besar kueri predikat dieksekusi dengan lambat, itulah sebabnya Anda mendapatkan kinerja yang baik saat Anda mengakses objek pertama di kumpulan hasil, dan bukan saat Anda membuat objek RLMResults.

Jika Anda menganggap penurunan kinerja karena melakukan hal ini tidak dapat diterima, Anda mungkin ingin mempertimbangkan untuk mencoba pendekatan lain terhadap hal ini. Misalnya, daripada menyalin objek ke NSArray, gunakan objek RLMResults, dan lacak hanya objek yang Anda inginkan menggunakan objek NSRange. Selain itu, karena hanya pemuatan awal yang lambat, saya juga menyarankan Anda mencoba dan mengoptimalkan kueri predikat Anda juga, misalnya, memastikan setiap properti yang Anda cari telah ditandai sebagai diindeks.

Jika hal yang lebih buruk menjadi lebih buruk, terkadang kinerja yang buruk tidak dapat dihindari, dan jika demikian, Anda dapat mengurangi pembekuan UI dengan memindahkannya ke thread latar belakang.

Saya harap itu membantu!

person TiM    schedule 24.05.2016
comment
Terima kasih atas balasannya, menurut saya penggunaan RLMResults tidak akan berhasil (saya juga tidak menemukan contoh penggunaannya), dan jika Realm benar-benar tidak memiliki cara lain untuk Membatasi hasil (belum?), mengoptimalkan kueri predikat (tidak selalu mungkin) DAN membuatnya dimuat di thread latar belakang adalah satu-satunya cara bagi saya untuk membuatnya lebih cepat dan tidak membekukan UI. - person J. Doe; 30.05.2016
comment
Terima kasih kembali! Ada beberapa contoh dan penjelasan RLMResults di halaman dokumentasi Realm (Terutama di bawah kueri: realm.io /docs/objc/latest/#queries) serta kode contoh. Menambahkan fitur pembatas telah dibahas sebelumnya (github.com/realm/realm-cocoa /issues/2608) namun diputuskan bahwa tidak ada alasan nyata untuk menambahkan mekanisme keras seperti itu karena tidak masuk akal dengan implementasi pemuatan lambat Realm (Ini hanya masalah tidak mengulang setiap objek yang dikembalikan dalam RLMResults. :) ). Dingin! Semoga beruntung! - person TiM; 31.05.2016
comment
Jadi sebenarnya tidak ada batasan yang mungkin, saya akan menandai ini sebagai jawaban;) - person J. Doe; 31.05.2016
comment
Jadi untuk memperjelas... tidak perlu membuat halaman karena pemuatan lambat sudah cukup efisien? - person Jules Lee; 07.09.2019
comment
Itu benar! Hanya Realm yang malas memuat properti yang akhirnya Anda akses, dan properti yang diakses sebelumnya akan dirilis secara otomatis seiring waktu. Jadi biasanya tidak perlu melakukan logika penomoran halaman untuk hasil kueri yang panjang. - person TiM; 08.09.2019