2015-11-09 3 views
0

Мне нужно искать в большом NSMutableArray из NSDictionary с около 50 000 записей. Я стараюсь:Поиск в большом NSMutableArray из NSDictionary

for (NSDictionary *aProduct in self.arrProduct) { 
    if ([[aProduct objectForKey:@"Name"]rangeOfString:@"search string" options:NSCaseInsensitiveSearch].location != NSNotFound) { 
     //got it 
    } 
} 

но с объектом 50.000 эта функция имела очень плохие характеристики. Я не хочу использовать Sqlite для поиска. Любая идея?

ТКС,

+0

является локальным массивом «self.arrProduct»? – Jamil

+0

Может быть, 'NSPredicate'? – Larme

+0

Почему у вас такой большой массив на мобильном устройстве? Почему не SQLite/Core Data? – Wain

ответ

0

Вы можете попробовать использовать enumerateObjectsUsingBlock: вместо быстрого перечисления.

Посмотрите на this для более подробной информации.

также: enumurateObjectsUsingBlock Vs for loops

+0

Он все равно будет медленным. – trojanfoe

+0

50k записей много, но enumerateObjectsUsingBlocks все еще быстрее или быстрее. Чтобы процитировать 2-ю ссылку: «enumerateObjectsUsingBlock: будет так же быстро или быстрее, чем быстрое перечисление (для (... in ...) использует поддержку NSFastEnumeration для реализации перечисления). Быстрое перечисление требует перевода из внутреннего представления в представление для быстрого перечисления. В нем есть накладные расходы ». – Lneuner

+0

Я не уверен, насколько быстрее это будет в вашем случае, но вы можете сравнить их и сообщить нам результаты – Lneuner

0

Если каждые данные имеют уникальный ключ, и что вы хотите ищете с уникальным ключом, то вы можете использовать Hash table.

Или ключ поиска - это номер, и вам нужно range search, ex key > 5 && key < 10. Тогда я думаю, что ordered binary tree будет полезен. Реализация бинарного дерева может быть найдена в GitHub, я поддерживаю, чтобы кто-то уже это сделал.


Что касается меня, я предпочитаю использовать SQLite, чтобы решить эту проблему рода. Добавление индекса в ключ поиска приведет к ускорению работы поиска. Мне не нравится хранить огромные данные в основной памяти.

+0

да, я изменил на SQLite, потому что нашел другой магазин с продуктами 200k и не могу использовать NSUserDefault для кэширования. – thienlode

+0

Если вам нужен кеш, возможно [ TMCache] (https://github.com/tumblr/TMCache) может помочь вам. Как правило, «система баз данных» реализует некоторый механизм кэширования для повышения производительности. Я использую «SQLite cache» как ключевые слова, а google дает много сообщений. – AechoLiu

0

Наконец, я использую CoreData. Массив не может работать с большими размерами данных.

Смежные вопросы