2

我在 c++ windows 中使用 sqlite,我的数据库大小约为 60M,当我打开 sqlite 数据库时,大约需要 13 秒。

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

如果我关闭了我的应用程序并重新打开它。它只用了不到 1 秒。

首先,我认为是因为磁盘缓存。所以我在sqlite打开前预加载了60M的db文件,使用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 开放进程。

4

1 回答 1

0

实际上,我不认为这将是一个缓存问题。我很确定当您打开 SQLite 时,它​​不会将整个数据库加载到内存中——它只是获得了一些相对少量的磁盘结构。

然而,一种可能性是它没有使用SQLITE_OMIT_AUTOINIT预处理器定义进行编译。在这种情况下,调用 tosqlite3_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);

并独立计时两个函数调用。可能是初始化占用了时间。

于 2010-06-12T13:14:54.120 回答