Время работы с БД SQLite очень долгое - PullRequest
2 голосов
/ 12 июня 2010

Я использую sqlite в окнах c ++, и у меня размер БД около 60 МБ. Когда я открываю БД sqlite, это занимает около 13 секунд.

sqlite3* mpDB;
nRet = sqlite3_open16(szFile, &mpDB); 

И если я закрыл свое приложение и снова открылэто снова.Это занимает всего менее 1 секунды.

Сначала я подумал, что это из-за дискового кэша.Поэтому я предварительно загружаю файл 60M db перед открытием sqlite и читаю файл с использованием CFile. Однако после предварительной загрузки первое время все еще очень медленное.

    BOOL CQFilePro::PreLoad(const CString& strPath)
    {
        boost::shared_array<BYTE> temp = boost::shared_array<BYTE>(new BYTE[PRE_LOAD_BUFFER_LENGTH]);
        int nReadLength;
        try
        {
            CFile file;
            if (file.Open(strPath, CFile::modeRead) == FALSE)
            {
                return FALSE;
            }
            do 
            {
                nReadLength = file.Read(temp.get(), PRE_LOAD_BUFFER_LENGTH);
            } while (nReadLength == PRE_LOAD_BUFFER_LENGTH);
        file.Close();
        }
        catch(...)
        {

        }
        return TRUE;
         }

Мой вопрос: в чем разница между первым открытиеми второй открытый.Как я могу ускорить открытый процесс sqlite.

1 Ответ

0 голосов
/ 12 июня 2010

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

Одна из возможностей, однако, заключается в том, что он не был скомпилирован с определением препроцессора SQLITE_OMIT_AUTOINIT. В этом случае вызов sqlite3_open16 приведет к вызову sqlite3_initialize().

В этой функции происходит довольно много, хотя я не уверен, сколько времени это займет. Функция sqlite3_initialize() поддерживает флаг, указывающий, что он был вызван ранее, а затем при последующих вызовах он будет (почти) немедленно завершен. Вот почему я упоминаю это как возможного виновника в разнице между первым и последующим открытием.

Я бы предложил изменить ваш код с:

sqlite3* mpDB;
nRet = sqlite3_open16(szFile, &mpDB);

до:

sqlite3* mpDB;
nRet = sqlite3_initialize();
if (nRet == SQLITE_OK)
    nRet = sqlite3_open16(szFile, &mpDB);

и синхронизацию двух вызовов функций независимо. Может быть, это инициализация, занимающая время.

...