1

我编写了一个小型 C# 应用程序,它通过 Mono 在 Linux 上运行,并使用 SQLite 将从磁盘读取的日志文件存储在数据库中。

我面临的瓶颈是,因为每个日志文件可以有 222000+ 个条目(有时一次有 1000 个日志文件),所以我的数据库上的写操作占用了程序运行的大部分时间。

有没有办法增加 SQLite 的 SQLITE_MAX_COMPOUND_SELECT 限制?因为我一次可以写入数据库的最大条目数是 500(我已经在使用)。

我知道有一个 C 接口 ( sqlite3_limit(db,SQLITE_LIMIT_COMPOUND_SELECT,size)),但我宁愿通过 C# 设置它,而不是进入 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

为了提高写入数据库的性能,我已从复合选择语句切换到预准备语句。这大大提高了执行速度。

如果在一个 100Mb 大小的日志文件之前需要 1 分 30 秒才能将其写入数据库,那么现在处理该文件只需要 30 秒。虽然这对其他人来说不能保证,但在我的情况下就足够了。

为了做到这一点,我使用了这个链接。虽然古老,但今天仍然适用。

于 2013-02-15T15:42:26.640 回答