2011-03-10 145 views
4

我试图从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。

+0

你确定,'begin'和'end'命令正在工作吗?如果删除它们,您是否注意到执行时间有变化? – 2011-03-10 10:05:46

+0

谢谢。是的,他们似乎在工作。我现在尝试,没有他们,至少需要10分钟(15秒)...我也尝试了transaction = connection.BeginTransaction()/。transaction.commit方式(理性表现如上)。 – DougF 2011-03-10 10:56:15

+0

好的。只是想要得到确认。因为我打算建议使用Transaction或TransactionScope ...但这不会解决您的问题,比...... – 2011-03-10 10:57:27

回答

1

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

因为我会用尽我的所有代码的选择(它看起来并不像任何人都有一个答案/问题,我的代码),我决定的问题可能在于数据库本身内...

我已经在SQLite Manager Firefox Plugin中创建了我的数据库和表格。

所以我重新创建了一切,从命令shell和BOOM!我的进口下降到几秒钟!

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

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