使用 c# 代码在更短的时间内将批量 CSV 数据插入 SQLite

Posted

技术标签:

【中文标题】使用 c# 代码在更短的时间内将批量 CSV 数据插入 SQLite【英文标题】:Insert bulk CSV data into SQLite in less time using c# code 【发布时间】:2017-10-31 16:36:58 【问题描述】:

我的 CSV 文件中有 300 万条数据。我想在 10 -15 分钟内将这些批量数据插入 SQLite 数据库。通常使用下面的代码需要 20 分钟。

我的样本:

SQLiteConnection con = new SQLiteConnection("Data Source="D:\\SQLiteData.db;Version=3;New=False;Compress=True;");
        if (!File.Exists("D:\\SQLiteData.db"))
        
            SQLiteConnection.CreateFile("D:\\SQLiteData.db");
        
        con.Open();
        SQLiteCommand com = con.CreateCommand();
        com.Transaction = con.BeginTransaction();
        com.CommandText = "CREATE TABLE Sample([ELEMENT_ID] real,[DATE] datetime,[COMMENT] real);"
            com.ExecuteNonQuery();
        com.CommandText = "INSERT INTO [Sample] VALUES(@C0,@C1,@C2)";
        using (var fileStream = new FileStream("E:\\comma.csv", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
        using (StreamReader streamReader = new StreamReader(fileStream))
        
            using (CsvReader reader = new CsvReader(streamReader))
            
                reader.ValueSeparator =’,’;
                reader.ReadHeaderRecord();
                while (reader.HasMoreRecords)
                
                    DataRecord record = reader.ReadDataRecord();
                    com.Parameters.Clear();
                    for (int i = 0; i < reader.HeaderRecord.Count; i++)
                    
                        com.Parameters.AddWithValue("@c" + i, string.Empty);
                    
                    com.ExecuteNonQuery();
                
            
        

谁能建议我在更短的时间内将批量 CSV 数据移动到 SQLite 的替代方法?

【问题讨论】:

“我有车,请你开动它” 你可以看看SQLite是否有这样的东西:docs.microsoft.com/en-us/sql/t-sql/statements/… 一旦您将数据放入数据表中,您就可以使用批量复制。您可以使用 oledb 更快地读取 csv 文件。在以下帖子中查看我的回复:***.com/questions/30129406/… 我会尝试使用存储过程并将 Table 传递给该 proc,该 proc 一次填充了一堆数据(不是全部,这可能太多而无法保存在表中?)。如果你让它异步,如果你在上传前一个时准备下一个,也许它会加快这个过程。 对其进行分析。我似乎记得必须编译托管 SQLite 包装器的自定义版本,因为它在每次查询执行时都会解析 XML 配置文件......此外,这将帮助您确定它是否真的是数据库的瓶颈或 CSV 阅读器。 【参考方案1】:

执行一个巨大的插入会导致单个 ExecuteNonQuery() 和单个事务应该提高性能。您也可以尝试通过 processInfo 导入 csv。

【讨论】:

以上是关于使用 c# 代码在更短的时间内将批量 CSV 数据插入 SQLite的主要内容,如果未能解决你的问题,请参考以下文章

如何在更短的时间内向初始 DataFrame 添加大量列(5000~1000 列)?

有没有更短的写 x == y OR x == z 的方法? [复制]

HikariCP - MYSQL 连接关闭后不允许操作。可能考虑使用更短的 maxLifetime 值

世界上最短的时钟代码!更短的,有木有?

textView 动态更改为更短的文本而不是 ellipsize

如何在java中编写更短的双数? [关闭]