2009-06-22 2 views
1

Я использую временные таблицы в приложении для iPhone на базе SQLite. Производительность была не такой, как требовалось, поэтому я рассматривал различные кандидаты на оптимизацию. Большинство из них хорошо работали и имели желаемый эффект. Тем не менее, я также хотел бы попробовать moving the temporary tables from flash into memory, чтобы узнать, есть ли улучшения.Временное хранилище таблиц в SQLite на iPhone

На реальном устройстве я стараюсь и настроить это с помощью:

PRAGMA temp_store = 2; 

Эти выполняется без ошибок. Однако, когда я запрашиваю конфигурацию с помощью:

PRAGMA temp_store; 

Нет результатов нет, так что я не в состоянии проверить, что эта конфигурация в действительности. Я могу читать другие настройки PRAGMA, такие как 'page_size'. Может кто-нибудь сказать мне:

  • Если это ожидаемое поведение
  • Если это конфигурация не поддерживается в SQLite на iPhone
  • Если такая оптимизация будет бессмысленным на iPhone, даже если бы это было возможно (из-за возможно, к аппаратным средствам)
  • Как я могу успешно переместить временное хранение таблицы в память в этом сценарии

Примечания: Я хорошо знаю Core Data в SDK 3.0, но у меня есть веские причины не использовать его.

Обновление: джиттер указал, что экземпляр SQLite на iPhone может быть скомпилирован с SQLITE_TEMP_STORE, чтобы всегда использовать временные файлы. Я не знал об этой настройке - есть ли способ подтвердить, что это так?

+0

Выясните, какие оптимизации вы уже сделали? И каков сценарий использования.Может быть, некоторые другие советы придут, а затем полетят в – jitter

ответ

1

Я просто добавил источник SQLite к своим проектам, потому что SQLite по крайней мере для iPhone OS 2.x не является потокобезопасным.

+0

Это очень интересный момент. Можете ли вы рассказать мне, как вы обнаружили, что стандартная версия не является потокобезопасной? – teabot

+0

Я предполагаю, что используется функция sqlite3_threadsafe(). http://www.sqlite.org/c3ref/threadsafe.html – jitter

+0

по умолчанию iphone sqlite dylib вырвал много предупреждений/ошибок при доступе к таблицам из нескольких потоков. – Alfons

1

Я не знаю, но думаю, что они скомпилировали sqllite с SQLITE_TEMP_STORE = 0. И есть еще один парень, который пробовал это и не добился успеха. SQLite optimization on the iPhone

  • пункт Список

я не могу попробовать это сам, но там, кажется, sqlite3TempInMemory() функция в источнике тоже (src/main.c). Не знаю, можете ли вы это назвать.

Этой функция возвращает истину, если основной памяти следует использовать вместо временного файла для временного пейджера файлов и выписка журналов. Возвращаемое значение зависит от значения db-> temp_store (параметр времени выполнения) и значение времени компиляции SQLITE_TEMP_STORE. В следующей таблице описано соотношение между этими двумя значениями, а это значение возвращается .

+1

Это все становится немного самореалистичным (ссылка идет на мой пост в блоге :-) Я надеялся, что я что-то упустил. – teabot

+0

ха-ха !! должен действительно отметить аватар, связанный в стиле stackoverflow. – jitter

+0

добавлен вызов функции, вы можете попробовать – jitter

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