gpt4 book ai didi

time - SQLite DB的开放时间真的很长

转载 作者:行者123 更新时间:2023-12-03 18:19:45 25 4
gpt4 key购买 nike

我在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的开放进程。

最佳答案

实际上,我不认为这将是一个缓存问题。我敢肯定,在打开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);


并分别计时两个函数的调用。可能是初始化占用了时间。

关于time - SQLite DB的开放时间真的很长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3028592/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com