1

Linux上でMonoを介して実行され、SQLiteを使用してディスクから読み取られたログファイルをデータベースに格納する小さなC#アプリケーションを作成しました。

私が直面しているボトルネックは、ログファイルにそれぞれ222000以上のエントリが含まれる可能性があるため(一度に数千のログファイルが含まれる場合もあります)、データベースへの書き込みアクションがプログラムの実行に最も多くの時間を費やしていることです。

SQLiteからSQLITE_MAX_COMPOUND_SELECT制限を増やす方法はありますか?一度にデータベースに書き込むことができるエントリの最大数は500です(私はすでに使用しています)。

Cインターフェイス()があることは知っていますが、Csqlite3_limit(db,SQLITE_LIMIT_COMPOUND_SELECT,size)にアクセスするのではなく、C#を介して設定したいと思います。

4

2 に答える 2

2

これは単なるCルーチンであるため、pInvokeを介してC#から呼び出すことができます。

[DllImport("sqlite3.dll")]
static extern int sqlite3_limit(IntPtr dbHandle, int id, int newVal);

次に、dbHandleを取得する必要があります。これは、Mono.Data.Sqliteで、次の場所にあると思います。

SqliteConnection._sql.handle。

これに到達するには、熟考が必要です。

私はこれをテストしていません(私はMonoまたはsqliteを持っていません)が、これでうまくいくと思います:

private void SetLimit(SqliteConnection conn, int newLimit)
{
   object sqlVar = conn.GetType().GetProperty("_sql", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(conn);
   IntPtr dbHandle = (IntPtr) sqlVar.GetType().GetProperty("handle", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(sqlVar);
   sqlite3_limit(dbHandle, 4, newLimit);
}

4は、SQLITE_LIMIT_COMPOUND_SELECT定数のハードコードされた値です。

アップデート

あなたがこれを呼ぶとき、接続は開いている必要があるでしょう、私は信じます、そしてそれは接続の間だけ続くでしょう。

于 2013-02-14T15:09:04.247 に答える
0

データベースへの書き込みのパフォーマンスを向上させるために、複合selectステートメントからpreparedステートメントに切り替えました。これにより、実行速度が大幅に向上しました。

サイズが100Mbのログファイルがデータベースに書き込まれるまでに1分30秒かかっていた場合、ファイルが処理されるのに30秒しかかかりませんでした。これは他の誰かに保証されているわけではありませんが、私の状況ではそれで十分です。

私はこれを行うためにこのリンクを使用しました。古いですが、これは今日でも当てはまります。

于 2013-02-15T15:42:26.640 に答える