Проверка объекта в списке в параллельном C# - PullRequest
0 голосов
/ 29 февраля 2020

Я реализую функцию импорта, в которой мне нужно прочитать данные из загруженного пользователем файла 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; }
}

Ниже приведены проверки, которые должны выполняться в объектах в списке, несколько примеров ниже:

  1. Не допускаются два заказа с одинаковыми SKU и OrderFulfillmentStartDate, OrderFulfillmentEndDate.
  2. Не допускаются два заказа с одинаковыми SKU и перекрывающимися OrderFulfillmentStartDate, OrderFulfillmentEndDate.

et c.

Способ, которым я реализовал это:

  1. Во время первого обращения к отдельной записи (прохождение всех проверок И "ValidationErrors" "== string.empty), я добавляю запись во временный список.
  2. Во время следующей итерации я проверяю текущую обрабатываемую запись с записью, присутствующей во временном списке, если проверка не удалась, я заполняю поле «ValidationErrors» и добавляю временный список.

Например:

enter image description here

Теперь суть вопроса: Размер данных может быть около Один миллион строк .

Когда я последовательно внедрил проверки, используя foreach l oop, процесс проверки занимал более 8 часов. Сказав это, я полагаю, что выполнение параллельной проверки уменьшит необходимое время.

Я попытался реализовать logi c, используя Parallel.ForEach и Partitioner концепт. Обработка ускорилась, но я не уверен, как сохранить временный список, который может использоваться / обновляться несколькими потоками в ForEach l oop во время проверки.

Есть ли лучший или более быстрый подход для достижения того, что я пытаюсь сделать здесь? Пожалуйста, дайте мне знать об этом.

Спасибо!

...