Управление памятью при использовании базы данных sqlite в iphone - PullRequest
3 голосов
/ 12 января 2009

Мое приложение использует базу данных SQLite для хранения входных данных пользователя. Количество записей во входных данных составит около 100 записей, и в приложении выполняется много операций SQL.

Когда я запускаю приложение с Object Allocations, оно показывает библиотеку sqlite libsqlite3.0.dylib, занимающую много памяти. Приводит ли библиотека libsqlite к утечке памяти? Как лучше всего общаться с базой данных? Большое количество вызовов sql увеличивает использование памяти моим приложением.

Может кто-нибудь, пожалуйста, дайте мне знать, как лучше всего использовать sqlite в приложении. (Я использую пример SQLiteBooks в качестве ссылки)

Спасибо.

Ответы [ 6 ]

8 голосов
/ 12 января 2009

Sqlite использует кеш для запросов. Время от времени закрывайте и снова открывайте базу данных, чтобы освободить кеш-память.

Вас не должно волновать, если ваши требования к памяти не высоки.

Вы можете перехватить критические условия в методе UIApplicationDelegate applicationDidReceiveMemoryWarning или UIViewController метод делегата didReceiveMemoryWarning

Если вызван один из этих методов, закройте и снова откройте базу данных.

5 голосов
/ 12 января 2009

Я не видел никаких утечек памяти, вызванных sqlite. Он использует разумный кусок памяти, но подумайте, сколько кода вам нужно написать и данных, которые вам нужно будет кэшировать, чтобы сделать то же самое ...

Лучший совет - использовать эффективный SQL и как можно скорее сбросить дескрипторы операторов. Завершение ваших подготовленных заявлений также может помочь, хотя я не нашел в этом необходимости.

Люди часто рекомендуют периодически закрывать и открывать базу данных. Хотя это не повредит, я сам не увидел никакой практической пользы.

Наконец, на веб-сайте sqlite вы увидите разговор о функциях управления памятью . Они звучат довольно соблазнительно, пока вы не поймете, что они не являются обязательными и не включены в сборку по умолчанию на iPhone.

4 голосов
/ 12 января 2009
3 голосов
/ 12 января 2009

У меня было использование памяти в SQLite, когда я выполнял много INSERT (> 1000) подряд. Производительность записи также была низкой. Эти проблемы были почти полностью устранены путем обертывания цикла, выполняющего вставки в транзакции. Я отправил пример кода для этого в ответ на этот вопрос .

2 голосов
/ 21 ноября 2009

Вы действительно хотите ограничить размер кеша sqlite в приложениях для iphone. Когда вы запускаете свое приложение и инициализируете базу данных, запускаете команду вроде:

const char *pragmaSql = "PRAGMA cache_size = 50";
if (sqlite3_exec(database, pragmaSql, NULL, NULL, NULL) != SQLITE_OK) {
    NSAssert1(0, @"Error: failed to execute pragma statement with message '%s'.", sqlite3_errmsg(database));
}

это предотвратит кэширование sqlite ваших запросов и медленное использование всей вашей памяти.

1 голос
/ 12 января 2009

Я видел всплеск использования памяти раньше, когда у меня была относительно большая база данных из-за плохой индексации. Если вы добавите в свою базу данных несколько хорошо продуманных индексов, это быстрый и простой способ восстановить использование памяти в реальном мире.

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