在SQLite中缓慢批量/批量插入

时间:2011-03-10 09:55:44

标签: c# .net sqlite bulkinsert

我尝试将数据从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)。

1 个答案:

答案 0 :(得分:1)

所以我认为我已经解决了这个问题 - 或者至少找到了解决方案。

由于我已经用尽所有代码选项(并且看起来没有人对我的代码有任何答案/问题),我认为问题可能在于数据库本身...

我在SQLite Manager Firefox插件中创建了我的数据库和表格。

所以我从命令壳和BOOM重新创建了所有内容!我的导入量下降到几秒钟!

我知道它无法处理64位整数(但只使用了TEXT数据类型)存在问题。也许SQLite Manager使用不同的SQLite引擎到.Net版本有问题?我不知道。

我的下一步可能是从我的应用程序中实际创建db +表,而不是让它们预先准备好...但我现在对性能相当满意,所以这不是优先考虑。