使用 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 值