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秒的更多相关文章

  1. element ui 渲染超过上百条数据时页面卡顿,更流畅的加载大量数据

    问题:element ui table渲染上百条数据,页面渲染开始出现延时 解决方案:使用pl-table 注意:设置use-virtual并给定table高度

  2. Java 线程池 +生产者消费者+MySQL读取300 万条数据

    1.1需求 数据库300 万条用户数据 ,遍历获取所有用户, 各种组合关联, 获取到一个新的json ,存到redis 上. 1.2 难点 数据库比较多, 不可能单线程查询所有的数据到内存. 1.3解 ...

  3. 极限挑战—C#+ODP 100万条数据导入Oracle数据库仅用不到1秒

    链接地址:http://www.cnblogs.com/armyfai/p/4646213.html 要:在这里我们将看到的是C#中利用ODP实现在Oracle数据库中瞬间导入百万级数据,这对快速批量 ...

  4. JAVA从文本文件(txt)读取一百万条数据保存到数据库

    Java读取大文本文件保存到数据库 1.追求效率 将文件读取到内存,效率比较高,经过测试读取1G左右的文本文件,机器内存消耗达到接近3个G,对内存消耗太大,不建议使用 2.通过调用第三方类库实现 通过 ...

  5. php使用cvs导出百万条数据,大量数据

    MySQL CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(45) NOT NULL DEFAUL ...

  6. 转: 从Mysql某一表中随机读取n条数据的SQL查询语句

    若要在i ≤ R ≤ j 这个范围得到一个随机整数R ,需要用到表达式 FLOOR(i + RAND() * (j – i + 1)).例如, 若要在7 到 12 的范围(包括7和12)内得到一个随机 ...

  7. jdbc读取百万条数据出现内存溢出的解决办法

    本人在做项目实施时,我们使用的是mysql数据库,在不到一个月的时间已经有了2千万条数据,查询的时候非常慢,就写了一个数据迁移的小项目,将这两千万条数据存放到MongoDB中看效率怎么样,再读取数据时 ...

  8. 从Mysql某一表中随机读取n条数据的SQL查询语句

    若要在i ≤ R ≤ j 这个范围得到一个随机整数R ,需要用到表达式 FLOOR(i + RAND() * (j – i + 1)).例如, 若要在7 到 12 的范围(包括7和12)内得到一个随机 ...

  9. SQL Server分页语句ROW_NUMBER,读取第4页数据,每页10条

    SQL Server分页语句ROW_NUMBER,读取第4页数据,每页10条 SELECT Id,[Title],[Content],[Image] FROM ( SELECT ROW_NUMBER( ...

随机推荐

  1. Python 基础之递归 递归函数 尾递归 斐波那契

    1.递归函数 定义:自己调用自己的函数递:去归:回有去有回是递归#(1)简单的递归函数def digui(n):    print(n)    if n > 0:        digui(n- ...

  2. Python语法速查: 20. 线程与并发

    返回目录 本篇索引 (1)线程基本概念 (2)threading模块 (3)线程间同步原语资源 (4)queue (1)线程基本概念 当应用程序需要并发执行多个任务时,可以使用线程.多个线程(thre ...

  3. Python3---常见函数---range()用法

    0X01函数说明: python range() 函数可创建一个整数列表,一般用在 for 循环中. 0X02函数语法: range(start,stop[,step]) start: 计数从 sta ...

  4. js通过cookie对两个没有关系的jsp页面进行传值

    //Cookie取值 function readCookie (name) { var cookieValue = ""; var search = name + "=& ...

  5. D - Beautiful Graph (深搜)

    这个题深搜容易解决,结果用了广搜,动手之前还是要想清楚,然后自己的代码写错的情况下,没有重写,而是在原有的基础上,进行修改,结果有个判定的初始化条件放错位置,浪费了一个小时... 就是给一个无向图,任 ...

  6. Oracle数据库自带了decode()函数

    Oracle数据库自带了decode()函数,函数的使用方法如下:   SELECT   emp.ename,   emp.job,   emp.sal,   decode(job, 'manager ...

  7. Android将数据存储到应用的数据目录下

    下面是具体代码,其中MainActivity.java的部分代码有修改,在文章后面给出 logindemo_layout.java <?xml version="1.0" e ...

  8. Commons BeanUtils 中对Map的操作

    CSDN学院招募微信小程序讲师啦 程序员简历优化指南! [观点]移动原生App开发 PK HTML 5开发 云端应用征文大赛,秀绝招,赢无人机! Commons BeanUtils 中对Map的操作 ...

  9. JAVA地址栏重写很详细

    这几天蛋疼.看看别人url重写是怎么搞的..1.解释下什么事url重写,以及它的优缺点: URL重写,其实就是把带一大堆参数的url,变成一个看上去很规矩的url.例:/viewthread.jsp? ...

  10. jmeter之http请求用csv读取中文乱码

    jmeter3.2版本中CSV Data Set Config从本地读取静态文件的时候,遇到中文乱码的解决方式如下: CSV Data Set Config设置 http请求数据显示乱码 把txt文档 ...