.net – 使用Dapper ORM提高SQLite批量插入的性能

前端之家收集整理的这篇文章主要介绍了.net – 使用Dapper ORM提高SQLite批量插入的性能前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用一个桌面应用程序,它使用sqlite将数万行批量插入sqlite数据库.我想帮助优化批量插入性能.目前需要长达50秒的时间将60兆的数据插入数据库.

>我可以使用什么连接字符串参数来改进
性能?我应该更改缓冲区大小吗?这可能是通过一个
连接字符串参数?是否有任何其他连接字符串
参数提高性能?我当前的连接字符串是:

Data Source=Batch.db;Version=3;Pooling=True;Max Pool
Size=10;Synchronous=off;FailIfMissing=True;Journal Mode=Off;

>我正在使用Dapper ORM. (由StackOverflow的人员构建)是否有更快的方式批量插入到.net中的sqlite?
> System.Data.sqlite用于插入到sqlite中.如何获得改进的sqlite的特殊编译版本
性能sqlite的一个版本比另一个版本好吗?目前
使用System.Data.sqlite从http://sqlite.phxsoftware.com
>目前,我在一个事务中包装插入以使它们更快(这是一个很好的改进).
>我一次插入一张表中,共17张.我可以在不同的线程并行化这个,使这更快吗?

当前业绩.
这是典型的吗我能做得更好吗

> 55,000行到19列的表:2.25秒插入(24k插入/秒)
> 10,000行到63列的表:2.74秒插入(3.7k /秒)

我喜欢sqlite,但我希望使它更快一些.目前使用XML序列化将对象保存到XML文件中比将其保存到sqlite数据库更快,所以我的老板问:为什么要切换到sqlite?还是应该使用MongoDB或其他对象数据库

解决方法

所以我终于找到了使用.NET在sqlite中高性能批量插入的技巧.这个技巧将插入性能提高了4.1倍!我的总节省时间从27秒到6.6秒.哇!

本文解释了fastest way to do bulk inserts into SQLite.关键是重用相同的参数对象,但是要为每个记录插入,分配一个不同的值. .NET构建所有这些DbParameter对象的时候真的加起来了.例如,100k行和30列= 300万个必须创建的参数对象.相反,创建和重用只有30个参数对象要快得多.

新表演:

> 55,000行(19列).53秒= 100k插入/秒

internal const string PeakResultsInsert = @"INSERT INTO PeakResult values(@Id,@PeakID,@QuanPeakID,@ISTDRetentionTimeDiff)";

            var command = cnn.CreateCommand();
            command.CommandText = BatchConstants.PeakResultsInsert;

            string[] parameterNames = new[]
                                 {
                                   "@Id","@PeakID","@QuanPeakID","@ISTDRetentionTimeDiff"
                                  };

            DbParameter[] parameters = parameterNames.Select(pn =>
            {
                DbParameter parameter = command.CreateParameter();
                parameter.ParameterName = pn;
                command.Parameters.Add(parameter);
                return parameter;
            }).ToArray();

            foreach (var peakResult in peakResults)
            {
                parameters[0].Value = peakResult.Id;
                parameters[1].Value = peakResult.PeakID;
                parameters[2].Value = peakResult.QuanPeakID;
                parameters[3].Value = peakResult.ISTDRetentionTimeDiff;

                command.ExecuteNonQuery();
            }

最后我不能使用Dapper插入我的大桌子. (对于我的小桌子,我仍然使用Dapper).

注意,我发现的其他一些事情:

>我尝试使用多个线程将数据插入同一个数据库,这没有任何改进. (没有什么区别)>从System.Data.sqlite升级1.0.69到1.0.79. (没有影响我的表现,我可以看到)>我没有将类型分配给DbParameter,它似乎没有使性能差异.对于阅读,我无法改善Dapper的表现.

猜你在找的Java相关文章