.NET 一次读取几百条数据优化,从原来30分钟优化到30秒
1、全部数据读取到内存,
不要使用string,而是使用stringbuilder,stringbuilder的效率非常高
2、添加到数据库
不要使用excute,而是使用事务,几百万条数据会请求数据库几百万次,而使用事务,只请求一次,速度提高几百万倍
string file = fileDialog.FileName;//返回文件的完整路径 SqliteHelper.ExecuteNonQuery("delete from BaseData"); StreamReader sr = new StreamReader(file, Encoding.Default); string content; StringBuilder sql = new StringBuilder(); int count = 0; int num = 0; DateTime starttime = DateTime.Now; var a = sr.ReadToEnd(); List<string> resultList = a.Split('.').ToList(); List<BaseData> baseDatas = new List<BaseData>(); List<string> sqlString = new List<string>(); Thread thread = new Thread(() => { foreach (var item in resultList) { var c = item.Replace("\r\n", ""); if (string.IsNullOrEmpty(c)) continue; List<string> str =c .Split(',').ToList(); if (str.Count() > 0) { //Console.WriteLine(content.ToString()); // sql.AppendLine($"INSERT INTO BaseData ( ProductCode,XinHao,Sku) values ('{str[0]}','{str[1]}','{str[2]}');"); sqlString.Add($"INSERT INTO BaseData ( ProductCode,XinHao,Sku) values ('{str[0]}','{str[1]}','{str[2]}');"); num++; // baseDatas.Add(new BaseData() { ProductCode = str[0], XinHao = str[1], Sku = str[2]}); //count++; //label1.Text = $"{count}条"; //if (num % 5000 == 0) //{ // //count += DapperHelper<BaseData>.insertDbBatch2(baseDatas); // //count += DapperHelper<BaseData>.ExecuteTransaction(sqlString); // count += DapperHelper<BaseData>.insertDbBatch3(sqlString); // sqlString.Clear(); // sql.Clear(); // num = 0; // baseDatas.Clear(); //} DateTime endtime = DateTime.Now; label2.Text = $"{(endtime - starttime).TotalSeconds}秒"; } } if (sqlString.Any()) { // count += SqliteHelper.ExecuteNonQuery(sql.ToString()); //count += DapperHelper<BaseData>.insertDbBatch(sql.ToString()); // count += DapperHelper<BaseData>.Execute(sql.ToString(),null); ; count += DapperHelper<BaseData>.insertDbBatch3(sqlString); DateTime endtime = DateTime.Now; label2.Text = $"{(endtime - starttime).TotalSeconds}分"; if (count > 0) MessageBox.Show("保存成功"); else MessageBox.Show("保存失败"); } }); thread.Start(); }
public static int insertDbBatch3(List<string> sqlList) { SQLiteConnection conn = new SQLiteConnection(connectionString); conn.Open(); SQLiteCommand cmd = new SQLiteCommand(conn); SQLiteTransaction trans = conn.BeginTransaction(); // <------------------- cmd.Transaction = trans; int cnt = 0; try { foreach (var sql in sqlList) { cmd.CommandText = sql; cnt += cmd.ExecuteNonQuery(); } trans.Commit(); } catch (Exception ex) { throw ex; } finally { if (conn.State == ConnectionState.Open) { conn.Close(); } } return cnt; }
posted on 2020-02-15 13:22 topguntopgun 阅读(559) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人