У меня есть приложение MVC5, я использую службу базы данных EF6 и MySQL от Azure, которая является CleanDB MySQL. У меня есть класс чтения CSV, который работает довольно быстро в моем консольном приложении. Тогда, в мое приложение MVC, у меня есть модель, как это:Как повысить производительность записи в базу данных в MVC5?
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, общий размер которых составляет 400 МБ, а всего около 9 миллионов. Только для целей тестирования я использовал самый маленький CSV-файл в моем списке, который был файлом размером 2 Мбайт, объемом около 15 тыс. Записей. Выполнение Update-Database
заняло около 40 минут, чтобы поместить все эти записи в базу данных. Вы можете предположить, сколько времени мне понадобится для 9 миллионов записей. Любая идея ускорить процесс?
Вы должны попробовать другой подход. Вероятно, EF не лучший инструмент для массовой загрузки данных. [Посмотрите здесь] (http://stackoverflow.com/questions/2821725/is-that-possible-to-do-bulk-copy-in-mysql) и [здесь] (http://stackoverflow.com/questions/ 4883376/how-to-bulk-insert-in-mysql-using-c-sharp) – Steve
Где ваши приборы показывают время, затрачиваемое? IE, я предполагаю, что ваше решение для регистрации имеет временные метки, поэтому на основе этих временных меток наиболее дорогостоящие операции, которые вы выполняете? Когда дело касается вопросов производительности, измерьте меру измерения! –
Стив прав. EF не предназначен для массовых операций (массовый импорт/экспорт). У каждой БД есть своя особенность. MSSQL, например, использует BCP. –