【问题标题】:Best Design Pattern for Large Data processing methods大数据处理方法的最佳设计模式
【发布时间】:2019-04-11 20:59:36
【问题描述】:

我正在重构一个应用程序,并尝试遵循一些“清洁代码”原则。我有一个应用程序,它从多个不同的数据源读取数据并操作/格式化该数据并将其插入另一个数据库。我有一个数据层,其中包含每个数据源的关联 DTO、存储库、接口和帮助程序,以及一个包含匹配实体、存储库和接口的业务层。

我的问题归结为导入方法。我基本上有一种方法可以系统地调用每个业务逻辑方法来读取、处理和保存数据。需要进行大量调用,即使 Import 方法本身根本不操作数据,该方法仍然非常大。有没有更好的方法来处理这些数据?

ICustomer<Customer> sourceCustomerList = new CustomerRepository();
foreach (Customer customer in sourceCustomerList.GetAllCustomers())
{

   // Read Some Data
   DataObject object1 = iSourceDataType1.GetDataByCustomerID(customer.ID)
   // Format and save the Data
   iTargetDataType1.InsertDataType1(object1)

   // Read Some Data

   // Format the Data

   // Save the Data

   //...Rinse and repeat
}

【问题讨论】:

  • 我发现 TPL 数据流非常适合这类事情。它非常强大,非常适合需要处理的数据管道
  • 以下是一些我认为需要考虑到您的问题以获得适当答案的因素。如果出现异常会发生什么,您需要回滚所有内容,还是重新开始处理?还是从您在此过程中中断的地方继续?将处理多少数据?如果您在读取时处理大量数据,您的 c# 应用程序的内存占用会急剧增加。
  • 关于异常我需要停止,找出异常发生的原因,然后在代码或数据本身中修复它,然后从左边恢复。所以我需要跟踪迭代并能够指定从哪个迭代开始。我正在处理大量数据,但一次只能处理一小部分数据。

标签: c# design-patterns coding-style


【解决方案1】:

你应该看看Task Parallel Library (TPL)Dataflow

ICustomer<Customer> sourceCustomerList = new CustomerRepository();

var customersBuffer = new BufferBlock<Customer>();
var transformBlock = new TransformBlock<Customer, DataObject>(
    customer => iSourceDataType1.GetDataByCustomerID(customer.ID)
);

// Build your block with TransformBlock, ActionBlock, many more... 
customersBuffer.LinkTo(transformBlock);

// Add all the blocks you need here....

// Then feed the first block or use a custom source
foreach (var c in sourceCustomerList.GetAllCustomers())
    customersBuffer.Post(c)
customersBuffer.Complete();

【讨论】:

  • 这看起来是一个相当不错的工作流程,但如果需要,我如何从转换块继续 for each?
【解决方案2】:

您的性能将受到 IO 限制,尤其是在每次迭代中对数据库进行多次访问的情况下。因此,您需要修改架构以最小化 IO。

是否可以将所有记录更靠近在一起(可能在临时数据库中)作为第一遍,然后在数据库中进行记录匹配和格式化作为第二遍,然后再将它们读出并将它们保存在需要的地方成为?

(顺便说一句,有时我们会被 DDD 和 OO 搞得一头雾水,因为所有东西都“需要”成为一个对象。但这并不总是最好的方法。)

【讨论】:

    猜你喜欢
    • 2023-03-21
    • 2020-11-04
    • 1970-01-01
    • 2017-07-14
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多