Как увеличить скорость создания этого запроса / объекта sqlite db в Objective-C? - PullRequest
1 голос
/ 14 февраля 2010

У меня есть следующий метод, который запрашивает таблицу sqlite db на iPhone он извлекает из таблицы около 6000 строк, а затем циклически перебирает те, которые создают 6000 объектов на основе информации и помещают их в массив.

Цикл , в то время как несколько медленный (на моем устройстве требуется ~ 10 секунд) Любые мысли о том, как я мог бы ускорить это?

TKS !!!

NSMutableArray  *dees              = [[NSMutableArray alloc] init];

if(sqlite3_open([database_path UTF8String], &database) == SQLITE_OK) {
  const char      *sqlStatement = "select cn, gn, df, or, id from doits order by lower(cn)";
  sqlite3_stmt    *compiledStatement;
  if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) {

    //loop through the results and feed them into the array
    while(sqlite3_step(compiledStatement) == SQLITE_ROW) {
        // Read the data from the result row
        NSString    *a_cn             = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 0)];
        NSString    *a_gn             = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)];
        NSString    *a_df             = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 2)];
        NSString    *an_or            = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 3)];
        NSString    *ident            = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 4)];

        DL   *dl = [[DL alloc] init];
        dl.cn            = a_cn;
        dl.gn            = a_gn;
        dl.df            = a_df;
        dl.or            = an_or;
        dl.primary_id    = [ident intValue];
        [dees      addObject:dl];
    }
}
sqlite3_finalize(compiledStatement);

Ответы [ 3 ]

2 голосов
/ 14 февраля 2010

Почему вы создаете все 6K во время выполнения? Как насчет ленивой загрузки их и создания только тех элементов, которые вам нужны, когда они вам нужны?

iphone не является настольным ПК, его процессор 400 + МГц, и итерация результатов 6K будет медленной.

Правильно ли проиндексирована ваша таблица? Не могли бы вы оптимизировать схему (типы полей?)? Вы действительно ничего не делаете, кроме как перебираете элементы 6K - так что я не вижу прямого способа оптимизировать этот цикл.

Я бы посмотрел увеличенную картинку и попытался бы найти способ ленивой загрузки или частичной загрузки данных. Скажем, вы используете данные для заполнения UITableView, может быть, вам нужен только первый слой, а не полностью обособленные объекты?

EDIT:

Что я имею в виду под типами полей, так это то, что в вашей базе данных есть 4x текстовых поля "sqlite3_column_text". Вам нужно использовать текстовые поля, или вы могли бы использовать что-то меньшее и, возможно, более оптимальное для ваших данных?

0 голосов
/ 21 июля 2011

после добавления результирующего объекта в массив, вы можете освободить его и посмотреть, увеличится ли производительность.

[dees addObject: dl];

[релиз d1];

что вы делаете, это создаете объект на лету и добавляете его в массив, но вы фактически не освобождаете объекты после его добавления. Думаю, это утечка памяти.

Спасибо

Суреш Кумар Нараянасами

0 голосов
/ 14 февраля 2010

Как говорит Mr-sk, плохая идея загружать все 6000 элементов одновременно, как по памяти, так и по соображениям производительности. Вы захотите пакетировать выборку так, чтобы в любой момент времени вы загружали только элементы на экране. Для выполнения поиска вам необходимо выполнить их как запросы к вашей базе данных.

Если вам нужно было переключить модель данных на использование Core Data, эта пакетная выборка становится тривиальной с использованием NSFetchedResultsController и -setFetchBatchSize: on NSFetchRequest. Подача только тех данных, которые вам нужны, в представление таблицы - это именно то, для чего предназначен этот класс. Для поиска вы можете предоставить NSFetchRequest, который фильтрует результаты на основе критериев поиска. Это приведет к огромному увеличению производительности вашего приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...