質問: fopen (inputdata,"r"); while (!feof(pfile)) { fgets (sinputbuf, buffer_size, pfile); sqlite3_bind_text(stmt, 1, strtok (sinputbuf, "\t"), -1, sqlite_transient); /* get route */ sqlite3_bind_text(stmt, 2, strtok (null, "\t"), -1, sqlite_transient); /* get branch */ sqlite3_bind_text(stmt, 3, strtok (null, "\t"), -1, sqlite_transient); /* get version */ sqlite3_bind_text(stmt, 4, strtok (null, "\t"), -1, sqlite_transient); /* get stop number */ sqlite3_bind_text(stmt, 5, strtok (null, "\t"), -1, sqlite_transient); /* get vehicle */ sqlite3_bind_text(stmt, 6, strtok (null, "\t"), -1, sqlite_transient); /* get date */ sqlite3_bind_text(stmt, 7, strtok (null, "\t"), -1, sqlite_transient); /* get time */ sqlite3_step(stmt); /* execute the sql statement */ sqlite3_clear_bindings(stmt); /* clear bindings */ sqlite3_reset(stmt); /* reset vdbe */ n++; } fclose (pfile); 注:実際のデータベースファイルの使用に戻りました。インメモリデータベースは高速ですが、必ずしも実用的ではありません 8.94秒で864913レコードをインポートしました パラメーターバインドで使用される文字列処理コードをわずかにリファクタリングすることで、1秒あたり96,700の挿入を実行できるようになりました。これはかなり高速だと言っても安全だと思います。他の変数(ページサイズ、インデックス作成など)の調整を開始すると、これがベンチマークになります。概要(これまで)あなたが私と一緒にいることを望みます!この道を始めたのは、sqliteによって一括挿入のパフォーマンスが非常に大きく変化するためであり、どのような変更が必要かは必ずしも明らかではありません操作をスピードアップします。同じコンパイラー(およびコンパイラーオプション)、同じバージョンのsqliteおよび同じデータを使用して、コードを最適化し、sqliteの使用を1秒あたり85回の挿入という最悪のシナリオから 1秒あたり96,000の挿入インデックスを作成してからinsert対insertしてからインデックスを作成selectパフォーマンスの測定を開始する前に、インデックスを作成することを知っています。以下の回答のいずれかで、一括挿入を行う場合、データを挿入した後にインデックスを作成する方が高速であることが示唆されています(最初にインデックスを作成してからデータを挿入するよりも)。やってみよう:インデックスを作成してからデータを挿入sqlite3_exec(db, "create index 'ttc_stop_index' on 'ttc' ('stop')", null, null, &serrmsg); sqlite3_exec(db, "begin transaction", null, null, &serrmsg); ... 18.13秒で864913レコードをインポートしました データを挿入してからインデックスを作成... sqlite3_exec(db, "end transaction", null, null, &serrmsg); sqlite3_exec(db, "create index 'ttc_stop_index' on 'ttc' ('stop')", null, null, &serrmsg); 13.66秒で864913レコードをインポートしました 予想どおり、1つの列にインデックスが付けられている場合、一括挿入は遅くなりますが、データの挿入後にインデックスが作成されると違いが生じます。インデックスなしのベースラインは、1秒あたり96,000の挿入です。 最初にインデックスを作成してからデータを挿入すると、1秒あたり47,700回の挿入が行われますが、最初にデータを挿入してからインデックスを作成すると、1秒あたり63,300回の挿入が行われます。私は喜んで他のシナリオを試してみてください...そして、selectクエリの同様のデータをまもなくコンパイルします。
回答: いくつかのヒント: 挿入/更新をトランザクションに入れます。 sqliteの古いバージョンの場合 - パラノイアの少ないジャーナルモード(pragma journal_mode)を考えてください。 normalがあり、それからoffがあります。osがクラッシュした場合にデータベースが壊れる可能性があることをあまり心配していなければ、挿入速度が大幅に向上します。アプリケーションがクラッシュした場合、データは問題ないはずです。新しいバージョンでは、off/memory設定はアプリケーションレベルのクラッシュに対して安全ではありません。 ページサイズで遊ぶことでも違いが出ます(pragma page_size)。大きなページサイズを持つと、大きなページがメモリに保持されるため、読み書きが少し速くなります。データベースにより多くのメモリが使用されることに注意してください。 インデックスがある場合は、すべての挿入を行った後にcreate indexを呼び出すことを検討してください。これは、インデックスを作成してから挿入を行うよりもはるかに高速です。 書き込みが行われるとデータベース全体がロックされるので、sqliteへの同時アクセスがある場合は、細心の注意を払う必要があります。複数のリーダーが存在する可能性はありますが、書き込みはロックアウトされます。これは、新しいsqliteバージョンにwalが追加されたことで多少改善されました。 スペースを節約することを利用してください...より小さなデータベースはより速く行きます。たとえば、キーと値のペアがある場合は、可能であればキーをinteger primary keyにしてみてください。これによって、テーブル内の暗黙の一意の行番号列が置き換えられます。 複数のスレッドを使用している場合は、 共有ページキャッシュ を使用すると、ロードされたページをスレッド間で共有できます。/oを呼び出します。 !feof(file)!を使わないでください 私はまたここで同様の質問をした そしてここで そして ここで 。