Я реализую функцию импорта, в которой мне нужно прочитать данные из загруженного пользователем файла CSV или Excel и выполнить несколько проверок и очистить данные перед записью данных в БД.
I ' m может получить данные из файла в список объектов со следующей структурой:
public class Order
{
public string Sku { get; set; }
public decimal Cost { get; set; }
public DateTime OrderFulfillmentStartDate { get; set; }
public DateTime OrderFulfillmentEndDate { get; set; }
public string ValidationErrors{ get; set; }
}
Ниже приведены проверки, которые должны выполняться в объектах в списке, несколько примеров ниже:
- Не допускаются два заказа с одинаковыми SKU и OrderFulfillmentStartDate, OrderFulfillmentEndDate.
- Не допускаются два заказа с одинаковыми SKU и перекрывающимися OrderFulfillmentStartDate, OrderFulfillmentEndDate.
et c.
Способ, которым я реализовал это:
- Во время первого обращения к отдельной записи (прохождение всех проверок И "ValidationErrors" "== string.empty), я добавляю запись во временный список.
- Во время следующей итерации я проверяю текущую обрабатываемую запись с записью, присутствующей во временном списке, если проверка не удалась, я заполняю поле «ValidationErrors» и добавляю временный список.
Например:
Теперь суть вопроса: Размер данных может быть около Один миллион строк .
Когда я последовательно внедрил проверки, используя foreach l oop, процесс проверки занимал более 8 часов. Сказав это, я полагаю, что выполнение параллельной проверки уменьшит необходимое время.
Я попытался реализовать logi c, используя Parallel.ForEach и Partitioner концепт. Обработка ускорилась, но я не уверен, как сохранить временный список, который может использоваться / обновляться несколькими потоками в ForEach l oop во время проверки.
Есть ли лучший или более быстрый подход для достижения того, что я пытаюсь сделать здесь? Пожалуйста, дайте мне знать об этом.
Спасибо!