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. Django 学习之From组件

    一.Form组件介绍 Form组件可以做的几件事情: 1.用户请求数据验证 2.自动生成错误信息 3.打包用户提交的正确信息 4.如果其中有一个错误了,其他的正确这,保留上次输入的内容 4.自动创建i ...

  2. SpringBoot--⼯具表达式对象

    ⼯具表达式对象除了这些基本的对象之外,Thymeleaf将为我们提供⼀组⼯具对象,这些对象将帮助我们在表达式中执⾏常⻅任务.#execInfo:有关正在处理的模板的信息.#messages:⽤于在变量 ...

  3. ping命令工具:同时ping多个IP

    检测多个ip在同一时间点的响应状态,通过对比来判断哪个ip异常. 下载地址:https://share.weiyun.com/5XCkypG

  4. windows下安装redis并部署服务

    下载地址: windows版本: https://github.com/MSOpenTech/redis/releases Linux版本: 官网下载: http://www.redis.cn/ gi ...

  5. Html转图片 -- wkhtmltox

    关于wkhtmltox,是一个可以把HTML转换为图片和pdf的工具. 不多介绍了,详见官网 https://wkhtmltopdf.org/ PHP 扩展 https://github.com/kr ...

  6. nginx反向代理(2)

    目录 nginx缓存 基本概念 常用模块 proxy_cache 超时相关 常见架构 ========================================================= ...

  7. 七 异常处理的两种方式(创建全局异常处理器&自定义异常)

    1 创建全局异常处理器 实现HandlerExceptionResolve接口 package com.springmvc01; import javax.servlet.http.HttpServl ...

  8. for 循环遍历数据动态渲染html

    本案例通过ajax动态获取数据,然后遍历出数据渲染html小心踩坑:因为有时候不注意,渲染页面的时候只能输出最后一个数据所以正确写法为下:如果AJAX数据请求成功的情况下: html <div ...

  9. Linux CentOS7 VMware usermod命令、用户密码管理、mkpasswd命令

    一. usermod命令 usermod可用来修改用户帐号的各项设定 -c, --comment 注释 GECOS 字段的新值 -d, --home HOME_DIR 用户的新主目录 -e, --ex ...

  10. java学习-初级入门-面向对象⑥-类与对象-静态static

    这次我们来学习静态(static) 知识点 1.静态方法只能调用静态变量 2.静态变量属于整个Class,会随着发生变化. 案例:定义一个自动增长的学生类. 题目要求: 定义一个学生类,除了姓名.性别 ...