我试图从csv文件导入到sqlite表中的数据。我的测试数据只有8Mb(50,000行),大约需要15秒。然而生产数据几乎是400Mb,并且需要永久(至少30分钟+,我放弃了等待)。在SQLite缓慢批量/批量插入
经过大量研究,我发现需要在单个事务中完成插入操作(这让我得到了15秒的导入,很棒的建议!:))所以这不是问题。 (AFAIK)
我也根据这个Robert Simpson post和许多变化在参数化INSERT语句上使用“ExecuteNonQuery()”。
我只是用TextReader.ReadLine()
和String.Split('\t')
,然后我读的地方约ReadLine()
由于磁盘的读取次数是缓慢的,所以我看着读bufferedStream,和整个this csv reader来了。但仍然没有明显的性能变化。
所以,我评论了我的插入循环的胆量和阅读发生在即时附近 - 所以我相信这个问题是在我插入。我已经尝试了创建参数化查询+单个事务的众多变体,但都具有几乎相同的结果..
下面是我的代码的常规版本。在此先感谢,这使我疯狂!我准备尝试导入到数据集和插入的是....
using (TextReader tr = File.OpenText(cFile))
{
using (SQLiteConnection cnn = new SQLiteConnection(connectionString))
{
string line;
string insertCommand = "INSERT INTO ImportTable VALUES (@P0,@P1,@P2,@P3,@P4)";
cnn.Open();
SQLiteCommand cmd = new SQLiteCommand("begin", cnn);
cmd.ExecuteNonQuery();
cmd.CommandText = insertCommand;
while ((line = tr.ReadLine()) != null)
{
string[] items = line.Split('\t');
cmd.Parameters.AddWithValue("@P0", items[0]);
cmd.Parameters.AddWithValue("@P1", items[1]);
cmd.Parameters.AddWithValue("@P2", items[2]);
cmd.Parameters.AddWithValue("@P3", items[3]);
cmd.Parameters.AddWithValue("@P4", items[4]);
cmd.ExecuteNonQuery();
}
cmd.CommandText = "end";
cmd.ExecuteNonQuery();
}
}
更新:我只是使用带有参数插件(只是硬编码一些值),小于5秒试过.. 。仍然没有我见过的文章那么快...
另外,我正在运行Core 2 Duo(3Ghz)和2G Ram,XP。
你确定,'begin'和'end'命令正在工作吗?如果删除它们,您是否注意到执行时间有变化? – 2011-03-10 10:05:46
谢谢。是的,他们似乎在工作。我现在尝试,没有他们,至少需要10分钟(15秒)...我也尝试了transaction = connection.BeginTransaction()/。transaction.commit方式(理性表现如上)。 – DougF 2011-03-10 10:56:15
好的。只是想要得到确认。因为我打算建议使用Transaction或TransactionScope ...但这不会解决您的问题,比...... – 2011-03-10 10:57:27