System.Data.Sqlite(C#)与Sqlite(C)性能

时间:2012-01-20 16:58:00

标签: sqlite mono

情况:.Net客户端应用程序(C#,Mono)从Web服务(SOAP)下载数据并将其存储到Sqlite DB中。数据库接口是System.Data.Sqlite,它在引擎盖下使用sqlite3.dll。

DB(130 MB)有几十个表。一个表格特别大,占用数据库大小的90% - 包含一些blob列的10000条记录。 (最大的blob有260K。)

在iPad上下载需要22分钟。当我评论实际写入DB时,花了大约11分钟,所以看起来DB也需要大约11分钟。 “DB”是指System.Data.Sqlite上面的一些层。还不知道细节。我所知道的是,所有数据库命令都在一个事务中,并且只涉及一些事务。 (换句话说,交易不是问题。)

当我使用Sqlite shell转储数据库并测量使用转储字符串调用sqlite3_exec()的C代码时(此代码远非最佳),我得到了大约50秒(iPad)。这意味着sqlite C代码可以非常快速地创建数据库。

另一个有趣的问题: 下载按表格组织。所有表(其中一些有几MB)都可以正常工作。除了最大的表,下载必须一次重组为几个项目(5)。没有这种措施,下载失败,内存不足。最可能的解释是内存碎片。 (Mono有GC问题,但没有提供良好的内存信息。)

我的感觉是下载过程本身是问题的一小部分。它的下载大小与数据库大致相同。碎片应该不是问题。但是单线程组织增加了延迟。

但是,我觉得最大的问题是应用程序中的数据处理。

  • 它必须解析几个协议(http,SOAP,Xml)
  • System.Data.Sqlite中的数据处理并调用sqlite3.dll。这可能涉及分配,编组等。

我们稍后会做更多的测试,但是现在我想问你一些想法。例如,我欢迎System.Data.Sqlite与原始Sqlite的性能比较。任何人

1 个答案:

答案 0 :(得分:1)

我在过去几天用Mono.Data.Sqlite做了一些测试,发现插入性能很差。

我只看到C#每秒约有14,000次插入,相比之下,C等价物约为38,000次。这是在使用插入1,024,000行的参数化语句的事务中插入字符串,字符串,字符串,字符串,字符串,字符串,DateTime。 (相同的性能下降了很多行)

注释掉实际的ExecuteNonQuery以及C和C#对我来说都经历了相同的迭代次数,每秒大约112,000次(生成字符串)所以在我的情况下,问题来自于但是mono正在使用sqlite处理interop。

这些测试一直在MacOSX下进行,我没有尝试使用实际设备,因为没有付费的monotouch许可证,看看是否会有所改善。