.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 = ;
int num = ;
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() > )
{
//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 > )
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 = ;
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;
}
.NET 一次读取几百条数据优化,从原来30分钟优化到30秒的更多相关文章
- element ui 渲染超过上百条数据时页面卡顿,更流畅的加载大量数据
问题:element ui table渲染上百条数据,页面渲染开始出现延时 解决方案:使用pl-table 注意:设置use-virtual并给定table高度
- Java 线程池 +生产者消费者+MySQL读取300 万条数据
1.1需求 数据库300 万条用户数据 ,遍历获取所有用户, 各种组合关联, 获取到一个新的json ,存到redis 上. 1.2 难点 数据库比较多, 不可能单线程查询所有的数据到内存. 1.3解 ...
- 极限挑战—C#+ODP 100万条数据导入Oracle数据库仅用不到1秒
链接地址:http://www.cnblogs.com/armyfai/p/4646213.html 要:在这里我们将看到的是C#中利用ODP实现在Oracle数据库中瞬间导入百万级数据,这对快速批量 ...
- JAVA从文本文件(txt)读取一百万条数据保存到数据库
Java读取大文本文件保存到数据库 1.追求效率 将文件读取到内存,效率比较高,经过测试读取1G左右的文本文件,机器内存消耗达到接近3个G,对内存消耗太大,不建议使用 2.通过调用第三方类库实现 通过 ...
- php使用cvs导出百万条数据,大量数据
MySQL CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(45) NOT NULL DEFAUL ...
- 转: 从Mysql某一表中随机读取n条数据的SQL查询语句
若要在i ≤ R ≤ j 这个范围得到一个随机整数R ,需要用到表达式 FLOOR(i + RAND() * (j – i + 1)).例如, 若要在7 到 12 的范围(包括7和12)内得到一个随机 ...
- jdbc读取百万条数据出现内存溢出的解决办法
本人在做项目实施时,我们使用的是mysql数据库,在不到一个月的时间已经有了2千万条数据,查询的时候非常慢,就写了一个数据迁移的小项目,将这两千万条数据存放到MongoDB中看效率怎么样,再读取数据时 ...
- 从Mysql某一表中随机读取n条数据的SQL查询语句
若要在i ≤ R ≤ j 这个范围得到一个随机整数R ,需要用到表达式 FLOOR(i + RAND() * (j – i + 1)).例如, 若要在7 到 12 的范围(包括7和12)内得到一个随机 ...
- SQL Server分页语句ROW_NUMBER,读取第4页数据,每页10条
SQL Server分页语句ROW_NUMBER,读取第4页数据,每页10条 SELECT Id,[Title],[Content],[Image] FROM ( SELECT ROW_NUMBER( ...
随机推荐
- Python 基础之if if else
1.代码块 以冒号作为开始,用缩进来划分区域,这个整体叫做代码块 if 5 == 5: print(1) print(2) if True: print(3) print(4) ...
- Python 中的else
在其他程序语言中,else 似乎只是与 if 关键字有缘分.而与其他的关键字没有联系,不能搭配使用,而在python中,else 除了与 if 匹配外, 还可以与for.while/ try等关键字匹 ...
- 单词「TJOI 2013」(AC自动机)
传送门 我们正常的建好Trie后求一遍fail.之后对于每一个节点,从它的fail连向它一条单项边.然后从根节点开始dfs. 记sum[i]代表从根到i号节点所代表的的字符串出现的次数,即该点的权值. ...
- eclipse 编辑窗口不见了(打开左边的java、xml文件,中间不会显示代码)
参考:https://blog.csdn.net/u012062810/article/details/46729779
- Linux-使用之vim出现的问题
参考来源: https://stackoverflow.com/questions/47667119/ycm-error-the-ycmd-server-shut-down-restart-wit-t ...
- java程序中的经常出现的的异常处理课后总结
一.JDK中常见的异常情况 1.常见异常总结图 2.java中异常分类 Throwable类有两个直接子类: (1)Exception:出现的问题是可以被捕获的 (2)Error:系统错误,通常由JV ...
- linux 串口 拼帧处理
串口每次read数据可能不是完整的数据,参照网上的代码,写了拼帧的代码#include <stdio.h> #include <termios.h> #include < ...
- java学习-抽象类和接口-抽象类初体验
今天在老师的带领下学习了抽象类(abstract)和接口(interface),总结一下今天所学的知识. 抽象类是在学习到接口时之前讲解,作为学习接口的铺垫. 下面是我今天写的例题. 一个Shape( ...
- Vmware tools变灰不能点击的问题
1. 挂载镜像文件,虚拟机->设置->硬件->CD/DVD.右边“连接”下面选择“使用IOS镜像文件”,浏览选择虚拟机包目录下面linux.iso 2. 挂载成功后,在虚拟机右下角c ...
- Day3-D-Protecting the Flowers POJ3262
Farmer John went to cut some wood and left N (2 ≤ N ≤ 100,000) cows eating the grass, as usual. When ...