我尝试将数据从csv文件导入sqlite表。我的测试数据只有大约8Mb(50,000行),大约需要15秒。然而,生产数据几乎是400Mb,并且需要永远(至少30分钟+,我放弃了等待)。
经过大量研究,我发现需要在一次交易中进行插入(这让我得到了15秒的导入,很棒的建议!:))所以这不是问题所在。 (AFAIK)
我也在参数化的INSERT语句中使用“ExecuteNonQuery()”按照Robert Simpson post - 以及众多变体。
我刚刚使用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秒......仍然没有我见过的文章那么快......
另外,我正在使用2G Ram,XP运行Core2 Duo(3Ghz)。
答案 0 :(得分:1)
所以我认为我已经解决了这个问题 - 或者至少找到了解决方案。
由于我已经用尽所有代码选项(并且看起来没有人对我的代码有任何答案/问题),我认为问题可能在于数据库本身...
我在SQLite Manager Firefox插件中创建了我的数据库和表格。
所以我从命令壳和BOOM重新创建了所有内容!我的导入量下降到几秒钟!
我知道它无法处理64位整数(但只使用了TEXT数据类型)存在问题。也许SQLite Manager使用不同的SQLite引擎到.Net版本有问题?我不知道。
我的下一步可能是从我的应用程序中实际创建db +表,而不是让它们预先准备好...但我现在对性能相当满意,所以这不是优先考虑。