0

我正在实现一个导入功能,其中我需要从用户上传的 CSV 或 Excel 文件中读取数据并运行一些验证并清理数据,然后再将数据写入数据库。

我可以将文件中的数据获取到对象列表中,其结构如下:

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 重叠的订单。

等等

我实现它的方式:

  1. 在第一次遇到不同记录期间(通过所有验证和“ValidationErrors”== string.empty),我将记录添加到临时列表中。
  2. 在下一次迭代中,我正在使用临时列表中的记录验证当前正在处理的记录,如果验证失败,我将填充“ValidationErrors”字段并添加临时列表。

例如:

在此处输入图像描述

现在来到问题的症结所在: 数据的大小可能在 100 万行左右

当我使用 foreach 循环按顺序实施验证时,验证过程需要 8 个多小时。话虽如此,我相信并行进行验证将大大减少所需的时间。

我确实尝试使用Parallel.ForEachPartitioner概念来实现逻辑。处理确实加快了,但我不确定如何在验证期间保留一个可由 ForEach 循环中的多个线程使用/更新的临时列表。

有没有更好或更快的方法来实现我在这里尝试做的事情?请务必让我知道。

谢谢你!

4

0 回答 0