Как ускорить мой импорт из файла Excel в базу данных SQL в MVC C # - PullRequest
0 голосов
/ 19 сентября 2019

Я использую Entity Framework и MVC C # для извлечения данных из файла Excel в таблицу SQL. Проблема в том, что я перебираю около семидесяти тысяч записей, поэтому я хотел бы знать, как я могу ускорить процесс.Я не думаю, что мой цикл for достаточно умен, так как в нем слишком много строк кода, и, возможно, именно поэтому обработка идет медленно.Я уверен, что есть более умный и быстрый способ.Я вставил свой для каждой петли ниже

 public ActionResult Upload(FormCollection formCollection)
            {
                var usersList = new List<marketingdbclients_tempDataTable>();
                if (Request != null)
                {
                    HttpPostedFileBase file = Request.Files["UploadedFile"];
                    if ((file != null) && (file.ContentLength > 0) && !string.IsNullOrEmpty(file.FileName))
                    {
                        string fileName = file.FileName;
                        string fileContentType = file.ContentType;
                        byte[] fileBytes = new byte[file.ContentLength];
                        var data = file.InputStream.Read(fileBytes, 0, Convert.ToInt32(file.ContentLength));
                        using (var package = new ExcelPackage(file.InputStream))
                        {
                            var currentSheet = package.Workbook.Worksheets;
                            var workSheet = currentSheet.First();
                            var noOfCol = workSheet.Dimension.End.Column;
                            var noOfRow = workSheet.Dimension.End.Row;
                            for (int rowIterator = 2; rowIterator <= noOfRow; rowIterator++)
                            {
                                var user = new marketingdbclients_tempDataTable();
                                user.FirstName = ConvertToString(workSheet.Cells[rowIterator, 2].Value);
                                user.MiddleName = ConvertToString(workSheet.Cells[rowIterator, 3].Value);
                                user.LastName = ConvertToString(workSheet.Cells[rowIterator, 4].Value);
                                //user.
                                user.RaceId = ConvertToString(workSheet.Cells[rowIterator, 6].Value);
                                user.DateOfBirth = ConvertToString(workSheet.Cells[rowIterator, 7].Value);
                                user.Age = ConvertToString(workSheet.Cells[rowIterator, 8].Value);
                                user.TitleTypeId = ConvertToString(workSheet.Cells[rowIterator, 9].Value);
                                user.Nationality = ConvertToString(workSheet.Cells[rowIterator, 10].Value);
                                user.PhysicalCountry = ConvertToString(workSheet.Cells[rowIterator, 11].Value);
                                user.PhysicalProvince = ConvertToString(workSheet.Cells[rowIterator, 12].Value);
                                user.PhysicalCity = ConvertToString(workSheet.Cells[rowIterator, 13].Value);
                                user.Area = ConvertToString(workSheet.Cells[rowIterator, 14].Value);
                                user.HighestQualification = ConvertToString(workSheet.Cells[rowIterator, 15].Value);
                                user.CurrentQualification = ConvertToString(workSheet.Cells[rowIterator, 16].Value);
                                user.PhysicalAddress = ConvertToString(workSheet.Cells[rowIterator, 17].Value);
                                user.Cell1 = ConvertToString(workSheet.Cells[rowIterator, 18].Value);
                                user.Cell2 = ConvertToString(workSheet.Cells[rowIterator, 19].Value);
                                user.Cell3 = ConvertToString(workSheet.Cells[rowIterator, 20].Value);
                                user.Cell4 = ConvertToString(workSheet.Cells[rowIterator, 21].Value);
                                user.Work1 = ConvertToString(workSheet.Cells[rowIterator, 22].Value);
                                user.Work2 = ConvertToString(workSheet.Cells[rowIterator, 23].Value);
                                user.Work3 = ConvertToString(workSheet.Cells[rowIterator, 24].Value);
                                user.Work4 = ConvertToString(workSheet.Cells[rowIterator, 25].Value);
                                user.Home1 = ConvertToString(workSheet.Cells[rowIterator, 26].Value);
                                user.Home2 = ConvertToString(workSheet.Cells[rowIterator, 27].Value);
                                user.Home3 = ConvertToString(workSheet.Cells[rowIterator, 28].Value); ;
                                user.Home4 = ConvertToString(workSheet.Cells[rowIterator, 29].Value);
                                user.LSMGroup = ConvertToString(workSheet.Cells[rowIterator, 30].Value);
                                user.Municipality = ConvertToString(workSheet.Cells[rowIterator, 31].Value);
                                user.Crediting_Rating = ConvertToString(workSheet.Cells[rowIterator, 32].Value);
                                user.Email1 = ConvertToString(workSheet.Cells[rowIterator, 33].Value);
                                user.Email2 = ConvertToString(workSheet.Cells[rowIterator, 34].Value);
                                user.Email3 = ConvertToString(workSheet.Cells[rowIterator, 35].Value);
                                user.Email4 = ConvertToString(workSheet.Cells[rowIterator, 36].Value);
                                user.Income = ConvertToString(workSheet.Cells[rowIterator, 35].Value);
                                user.Company = ConvertToString(workSheet.Cells[rowIterator, 36].Value);
                                user.Industry = ConvertToString(workSheet.Cells[rowIterator, 37].Value);
                                user.JobTitle = ConvertToString(workSheet.Cells[rowIterator, 38].Value);
                                user.LeadStage = ConvertToString(workSheet.Cells[rowIterator, 39].Value);
                                user.ReggieNumber = ConvertToString(workSheet.Cells[rowIterator, 40].Value);
                                user.Source = ConvertToString(workSheet.Cells[rowIterator, 41].Value);
                                //user.SNo = Convert.ToInt32(workSheet.Cells[rowIterator, 1].Value);
                                //user.Name = workSheet.Cells[rowIterator, 2].Value.ToString();
                                //user.Age = Convert.ToInt32(workSheet.Cells[rowIterator, 3].Value);
                                usersList.Add(user);
                            }
                        }
                    }
                }
                //MarketingDBEntitiesModel db = new MarketingDBEntitiesModel();
                using (MarketingDBEntitiesModel excelImportDBEntities = new MarketingDBEntitiesModel())
                {
                    foreach (var item in usersList)
                    {
                        excelImportDBEntities.marketingdbclients_tempDataTable.Add(item);
                    }
                    excelImportDBEntities.SaveChanges();
                }
                return View("Index");
            }
public string ConvertToString(object value)
        {
            try
            {
                return value.ToString();
            }
            catch
            {
                return "Null";
            }
        }

1 Ответ

0 голосов
/ 19 сентября 2019

Это будет становиться все медленнее и медленнее, поскольку DbContext будет отслеживать каждую сущность при ее сохранении.Разбейте его на куски по 500-1000 строк, считанные из Excel и вставленные через DbContext, но будьте готовы обрабатывать исключения.

Эти две строки не кажутся необходимыми:

byte[] fileBytes = new byte[file.ContentLength];
var data = file.InputStream.Read(fileBytes, 0, Convert.ToInt32(file.ContentLength));

Вы в основном читаете весь файл в память, но позже используете InputStream для чтения в Excel.

Вместо этого используйте входной поток для чтения 1000 строк в объекты, затем добавьте строки вудаленный (/ w using block) экземпляр DbContext с помощью одного SaveChanges() вызова.Вам нужно будет обработать исключение, учитывая, что в случае сбоя одной строки, этот блок из 1000 не будет сохранен.

Для таких больших операций, как этот, я не буду обрабатывать файл как часть веб-запроса, но вместо этого сохраните файл на сервере, создайте запись в таблице очереди обработки с указанием местоположения файла и ожидающего статуса и верните страницу.Фоновый рабочий процесс может опросить очередь обработки, забрать файл и полностью обработать его в фоновом режиме, обновив состояние записи.Ваш веб-интерфейс может опрашивать запись очереди, чтобы сообщить о начале обработки очереди и отслеживать ход выполнения по своему усмотрению.Основная проблема с обработкой запроса в строке, как это, заключается в том, что он потребует хорошего куска процессора и памяти, и ничто не мешает нескольким пользователям запустить это действие.В очереди, даже если вы получите 100 запросов, они будут обрабатываться только так быстро, как работник очереди (или координируется между работниками), что ограничит влияние на доступные ресурсы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...