2

私はc++ウィンドウでsqliteを使用していますが、dbサイズは約60Mです。sqlitedbを開くと、約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ただし、1 つの可能性は、プリプロセッサの定義を使用してコンパイルされていない場合です。その場合、 を呼び出すと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);

2 つの関数呼び出しのタイミングを個別に調整します。初期化に時間がかかっている可能性があります。

于 2010-06-12T13:14:54.120 に答える