我在c ++窗口中使用sqlite,而且我的db大小约为60M, 当我打开sqlite db时,大约需要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 open-process。
答案 0 :(得分:0)
实际上,我认为这不是一个缓存问题。我很确定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);
并独立计时两个函数调用。可能是初始化占用了时间。