Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Time SQLite DB的开放时间真的很长 我在C++窗口中使用SQLite,我的数据库大小大约是60m, 当我打开sqlite数据库时,大约需要13秒 sqlite3* mpDB; nRet = sqlite3_open16(szFile, &mpDB);_Time_Sqlite_Long Integer - Fatal编程技术网

Time SQLite DB的开放时间真的很长 我在C++窗口中使用SQLite,我的数据库大小大约是60m, 当我打开sqlite数据库时,大约需要13秒 sqlite3* mpDB; nRet = sqlite3_open16(szFile, &mpDB);

Time SQLite DB的开放时间真的很长 我在C++窗口中使用SQLite,我的数据库大小大约是60m, 当我打开sqlite数据库时,大约需要13秒 sqlite3* mpDB; nRet = sqlite3_open16(szFile, &mpDB);,time,sqlite,long-integer,Time,Sqlite,Long Integer,如果我关闭我的应用程序并再次打开它。这只需要不到1秒的时间 首先,我认为这是因为磁盘缓存。因此,我在sqlite打开之前预加载了60M db文件,并使用CFile读取该文件,但是,在预加载之后,第一次还是非常慢 BOOL CQFilePro::PreLoad(const CString& strPath) { boost::shared_array<BYTE> temp = boost::shared_array<BYTE>(new

如果我关闭我的应用程序并再次打开它。这只需要不到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;
         }
BOOL-CQFilePro::预加载(const-CString和strPath)
{
boost::shared_array temp=boost::shared_array(新字节[PRE_LOAD_BUFFER_LENGTH]);
int-nReadLength;
尝试
{
文件文件;
if(file.Open(strPath,CFile::modeRead)==FALSE)
{
返回FALSE;
}
做
{
nReadLength=file.Read(temp.get(),预加载缓冲区长度);
}而(nReadLength==预加载缓冲区长度);
file.Close();
}
捕获(…)
{
}
返回TRUE;
}
我的问题是第一次公开赛和第二次公开赛有什么区别。
如何加快sqlite开放过程。

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

然而,一种可能性是,它没有使用
SQLITE\u OMIT\u AUTOINIT
预处理器define编译。在这种情况下,调用
sqlite3\u open16
将导致调用
sqlite3\u initialize()

在这个函数中发生了很多事情,尽管我不确定需要多少时间。
sqlite3\u initialize()
函数维护一个标志,指示它以前被调用过,然后在后续调用中,它将(几乎)立即退出。这就是为什么我提到它可能是第一次和后续打开之间差异的罪魁祸首

我建议您将代码更改为:

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


以及独立地对两个函数调用进行计时。这可能是因为初始化占用了时间。

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

然而,一种可能性是,它没有使用
SQLITE\u OMIT\u AUTOINIT
预处理器define编译。在这种情况下,调用
sqlite3\u open16
将导致调用
sqlite3\u initialize()

在这个函数中发生了很多事情,尽管我不确定需要多少时间。
sqlite3\u initialize()
函数维护一个标志,指示它以前被调用过,然后在后续调用中,它将(几乎)立即退出。这就是为什么我提到它可能是第一次和后续打开之间差异的罪魁祸首

我建议您将代码更改为:

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


以及独立地对两个函数调用进行计时。可能是初始化占用了时间。

尝试使用SQLite的命令行工具(sqlite3.exe)打开数据库,看看是否也需要这么长时间。尝试使用SQLite的命令行工具(sqlite3.exe)打开数据库,看看是否也需要这么长时间。