我有一个MVC5应用程序,我使用Azure的EF6和MySQL数据库服务,即CleanDB MySQL。我有一个CSV阅读器类,它在我的控制台应用程序中运行得非常快。然后,在我的MVC应用程序中,我有一个这样的模型:
Provider.cs
public class Provider
{
public int ProviderId { get; set; }
public string ProviderName { get; set; }
public string Email { get; set; }
public string Address { get; set; }
public string City { get; set; }
[ForeignKey("State")]
public int StateID { get; set; }
public virtual State State { get; set; }
public string Zip { get; set; }
public string Phone { get; set; }
public string Fax { get; set; }
public string SICCode { get; set; }
public string Description { get; set; }
public string Website { get; set; }
public string RefId { get; set; }
}
然后,在我的 Configuration.cs 文件中,我有类似的内容:
string[] csvs = Directory.GetFiles(@"C:\Users\User\Downloads\db\test\");
foreach (string csv in csvs)
{
using (CsvReader reader = new CsvReader(csv))
{
foreach (string[] values in reader.RowEnumerator)
{
var provider = new Provider();
provider.ProviderName = values[0];
provider.Email = values[1];
provider.Address = values[2];
provider.City = values[3];
provider.StateID = 491;
provider.Zip = values[5];
provider.Phone = values[6];
provider.Fax = values[7];
provider.SICCode = values[8];
provider.Description = values[9];
provider.Website = values[10];
provider.RefId = "";
context.Providers.Add(provider);
}
}
}
context.SaveChanges();
重点是我有大约50个CSV文件,总大小为400MB,总条目大约为900万。仅出于测试目的,我使用了列表中最小的CSV文件,这是一个2MB的文件,大约有15k条目。执行Update-Database
花了大约40分钟将所有这些条目放入数据库。你可以假设我需要多少时间才能获得900万条款。知道如何加快这个过程吗?
答案 0 :(得分:0)
您确定数据库性能实际上是问题所在吗?通过直到最后不调用SaveChanges
,实体框架在一个事务中对所有内容进行批处理,因此除了传输时间之外,您只需要向任何数据库表添加900万条目的标准成本。除了为数据库服务器提供更多资源之外,您还无法做很多事情,这可能会或可能不会产生影响,具体取决于当前资源受限情况。即使在最糟糕的情况下,实际查询的传输时间也不应超过一秒,除非您只有世界上最糟糕的连接或者尝试通过拨号或其他方式执行此操作。
可能,您最大的成就是实际访问文件系统并从CSV文件中读取。我会仔细查看你的CSVReader
,看看是否可以找到更高效的替代品。另外,我不确定这个库是如何工作的,但是如果它从文件系统中传输文件,那么最好一次将它全部读入内存(假设你有足够的RAM)。访问驱动器上的许多小型集群通常比读取单个大型集群要慢。一个非常粗略的比喻可能是将文件复制到USB驱动器(因为这是我们所有人都有的经验)。我确定您已经注意到复制4000个1KB文件比复制一个4 MB文件需要更长的时间,并且只能从那里进行扩展。