zoukankan      html  css  js  c++  java
  • EF Core使用遇到的问题

    开个贴,专门记录使用EF Core遇到的问题,以后自己用.net写东西,操作数据库就使用EF Core了

    EF Core速度问题

    问题描述

    我需要导入600多个csv文件,批量导入不会弄,网上也没查

    使用了读取再存储的方法

    EF使用方法1,每一行存储一次(400条/s)

    可以看下面的代码每一行存一次,这种方法的速度差不多是每秒400多条数据的样子

    foreach (var csvName in 600个文件)
    {
        foreach (var 每一行 in 所有行)
        {
            using (var context = new MyContext())
            {
                context.dGKs.Add(dGK);
                context.SaveChanges();
            }
        }
    }     
    

    EF使用方法2,链接不释放 (40条/s)

    我感觉是using (var context = new MyContext())这个的问题,因为using括号内就是一次对数据库的链接和释放,所以我把代码改成下面这样了,结果大跌眼镜

    using (var context = new MyContext())
    {
        foreach (var csvName in 600个文件)
        {
            foreach (var 每一行 in 所有行)
            {
                context.dGKs.Add(dGK);
                context.SaveChanges();
            }
        }
    }   
    

    上面这样,我以为只有一次的链接释放会快一点,没想到更慢了,方法1每秒400多条数据,方法2这样每秒只有几十条,真的慢

    EF使用方法3,多次add,一次SaveChanges(400条/s,但是数据库操作异常慢)

    经过方法2,我又想了,多次add,然后一次SaveChanges,这样会不会快一点?代码又改成了下面这样

    using (var context = new MyContext())
    {
        foreach (var csvName in 600个文件)
        {
            foreach (var 每一行 in 所有行)
            {
                context.dGKs.Add(dGK);
            }
            context.SaveChanges();
        }
    }   
    

    这样的结果也很不好,首先半天没反应,有反应了数据库突然出现几万条数据,这和方法1每秒400条/s的速度也差不多啊

    缺点还有:

    1. 我手动操作数据库的时候,单单一个查询语句半天才有反应,不能使用这个方法3
    2. 如果文件很大,我所有的行都add到一起,如果是70万条数据呢,据说EF Core最大1000条数据,再大就很慢了

    所以,根据以上两个缺点,方法3也很差劲

    所以,我最后还是改为了方法1

    using内部千万不要使用try catch

    问题描述,有一个字段是字符类型的,例如: "12.123","None"

    我想判断这个字段是不是数字,不是数字的话直接改为"0",因为数据库里面的字段直接设定的Decimal类型

    然后,我脑残的使用了try catch,还是在using内部使用的,如下

    using (var context = new MyContext())
    {
        try{
            dgk.aaa = int.Prase(dgk.aaa).toString();
        }
        catch{
            dgk.aaa = "0";
        }
        context.dGKs.Add(dGK);
        context.SaveChanges();
    }
    

    速度真的是超级慢了,每秒才30多条数据,慢死,catch真的耗时间

    所以我换成了正则,话说,我一直不会正则

    using (var context = new MyContext())
    {
        if (!Regex.IsMatch(dGK.aaa, @"^d+.d+$"))
        {
            dGK.aaa = "0";
        }
        context.dGKs.Add(dGK);
        context.SaveChanges();
    }
    

    换了正则之后和方法1差不多了,每秒400多条

  • 相关阅读:
    PHP抛出简单说明
    html设置强制缓存的方法
    php yield处理大数据的方法
    pixijs 粒子聚合图片
    PHP监听消息队列的方法
    C++ fstream 二进制读写文件 (一个文件备份的例子)
    Ubuntu18.04下Docker CE安装
    Python3.9安装
    如何通过SQL命令更改Postgres的max_connections
    ubuntu 配置br0网桥,亲测有效
  • 原文地址:https://www.cnblogs.com/yunquan/p/11581916.html
Copyright © 2011-2022 走看看