Asp.net mvc 同时添加数百万条记录

Asp.net mvc 同时添加数百万条记录,asp.net-mvc,Asp.net Mvc,我有一个asp.NETMVC5应用程序,我用它来存储数据。在10个不同的excel文件中总共有8500万条记录。我上传一个excel文件,系统将文件中的记录存储到我的数据库中。但这需要很多时间,65K记录大约需要1小时左右。我有没有办法加快速度?这些速度正常吗 该应用程序托管在我的本地主机上,因此互联网速度不是问题。我检查了一下,系统每秒写15条记录 我将MVC5与MS SQL一起使用。从文件读取并写入excel的代码为: //Reads excel file u

我有一个asp.NETMVC5应用程序,我用它来存储数据。在10个不同的excel文件中总共有8500万条记录。我上传一个excel文件,系统将文件中的记录存储到我的数据库中。但这需要很多时间,65K记录大约需要1小时左右。我有没有办法加快速度?这些速度正常吗

该应用程序托管在我的本地主机上,因此互联网速度不是问题。我检查了一下,系统每秒写15条记录

我将MVC5与MS SQL一起使用。从文件读取并写入excel的代码为:

                //Reads excel file using ExcelDataReader Package
                var dataTable = result.Tables[0];

                //Read each row one by one
                for (var i = 0; i < dataTable.Rows.Count; i++)
                {
                    //Read Properties
                    var FName = dataTable.Rows[i][0].ToString().Trim(); //First Name
                    //This goes on, I have 11 properties

                    //Create DbEntity
                    var dbEntity = new DbEntity
                    {
                        FirstName = FName,
                        //Do the same for all other properties
                    };

                    var entities = db.DbEntities.Where(d => d.Phone == dbEntity.Phone).ToList();

                    if (entities.Count() > 0) 
                    {
                        //If it is duplicate, set IsDuplicate to true
                        dbEntity.IsDuplicate = true;

                        //Set occurance = count(entities) + 1
                        dbEntity.Ocurance = entities.Count() + 1;
                    }
                    else
                    {
                        //If the entity is unique, set IsDuplicate to false
                        dbEntity.IsDuplicate = false;

                        //Set the occurance to 1
                        dbEntity.Ocurance = 1;
                    }

                    //Set WasSent to false
                    dbEntity.WasSent = false;

                    //Add Entity to records
                    if(dbEntity.Phone.Length == 10)
                    {
                        db.DbEntities.Add(dbEntity);
                        db.SaveChanges();
                        ++validCount;
                    }
                    else
                    {
                        //If record is not valid, skip it and add it to invalidRec list
                        invalidRecs.Add(dbEntity);
                    }
                }

                reader.Close();
                //Sending result data to View

                var data = new ImportResultViewModel
                {
                    ValidCount = validCount,
                    InvalidList = invalidRecs
                };
                return View("ImportResult",data);
            }
//使用ExcelDataReader包读取excel文件
var dataTable=result.Tables[0];
//逐行读
对于(var i=0;id.Phone==dbEntity.Phone.ToList();
if(entities.Count()>0)
{
//如果它是重复的,则将IsDuplicate设置为true
dbEntity.IsDuplicate=true;
//设置发生率=计数(实体)+1
dbEntity.Ocurance=entities.Count()+1;
}
其他的
{
//如果实体是唯一的,请将IsDuplicate设置为false
dbEntity.IsDuplicate=false;
//将发生率设置为1
dbEntity.Ocurance=1;
}
//设置被发送到false
dbEntity.WasSent=false;
//将实体添加到记录中
if(dbEntity.Phone.Length==10)
{
db.DbEntities.Add(dbEntity);
db.SaveChanges();
++有效计数;
}
其他的
{
//如果记录无效,请跳过它并将其添加到invalidRec列表中
invalidRecs.Add(数据库实体);
}
}
reader.Close();
//将结果数据发送到视图
var数据=新的ImportResultViewModel
{
ValidCount=ValidCount,
InvalidList=invalidRecs
};
返回视图(“导入结果”,数据);
}

如您所见,我逐个添加每条记录。如果我将所有有效记录保存在一个列表中,然后将整个列表添加到数据库中,会更好吗?这会提高性能吗?

在这种情况下,我强烈建议不要使用实体框架,至少对于这个函数。在纯SQL/Ado.Net中,您可以使用BulkInsert在几秒钟内处理您的请求,对于事务来说,85k并不是那么重要,尤其是如果您的SQL server甚至有一半的规范。另一个似乎已被弃用的Nuget包(我仍然在生产代码中使用它,但我也对代码执行了审计)是

我对在生产中使用它很有信心,但每个人的参数都不同。如果您真的想挤出性能并更喜欢ADO.Net(原始),仍然有两个选项可用:

(复印件)


(批处理数据表适配器)

您没有提供任何相关详细信息。什么数据库?您使用什么技术连接到数据库?向我们显示您用于写入记录的代码。Sql Server?如果是这样的话,请对批量插入或SSIS包进行一些研究,这应该比通过代码执行要快得多。不过,你能否做到这一点取决于许多其他因素。简而言之,您需要做更多的研究或在问题中提供更多的细节。抱歉,使用代码更新了问题。生成
List()
并使用
db.DbEntities.AddRange(DbEntities)
。比如说,执行100次批处理,然后添加范围,然后保存更改()。