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