Bro*_*ing 10 .net sqlite dapper
我正在开发一个桌面应用程序,它使用SQLite将数万行批量插入SQLite数据库.我想帮助优化批量插入性能.目前,将60兆位的数据插入数据库需要50秒.
我可以用什么连接字符串参数来提高性能?我应该更改缓冲区大小吗?这可以通过连接字符串参数吗?是否有其他连接字符串参数可以提高性能?我当前的连接字符串是:
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的一个版本比另一个版本好吗?目前正在使用http://sqlite.phxsoftware.com上的 System.Data.SQLite
目前,我在事务中包装插入以使它们更快(这是一个很好的改进).
我一次插入一张表到17张表.我可以在不同的线程上并行化这个并使其更快吗?
目前的表现. 这是典型的吗?我可以做得更好吗?
我喜欢SQLite,但我希望能让它快一点.目前使用XML序列化将我的对象保存到XML文件比保存到SQLite数据库要快,所以我的老板问:为什么要切换到SQLite?或者我应该使用MongoDB还是其他一些对象数据库?
Bro*_*ing 14
所以我终于找到了使用.NET在SQLite中进行高性能批量插入的技巧.这个技巧将插入性能提高了4.1倍!我的总节省时间从27秒增加到6.6秒.哇!
本文介绍了批量插入SQLite的最快方法.关键是重用相同的参数对象,但要为每个记录插入,分配不同的值..NET构建所有这些DbParameter对象的时间确实增加了.例如,100k行和30列= 300万个必须创建的参数对象.相反,创建和重用仅30个参数对象要快得多.
新表现:
在.53秒内55,000行(19列)= 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();
}
Run Code Online (Sandbox Code Playgroud)最终我无法使用Dapper插入我的大表.(对于我的小桌子,我仍然使用Dapper).
请注意,我发现的其他一些事情:
我尝试使用多个线程将数据插入到同一个数据库中,这没有任何改进.(没有区别)
从System.Data.Sqlite 1.0.69升级到1.0.79.(在我看到的表现上没有什么不同)
我没有为DbParameter分配一个Type,它似乎不会产生任何性能差异.
对于读取,我无法改善Dapper的性能.
| 归档时间: |
|
| 查看次数: |
8818 次 |
| 最近记录: |