大数据处理方法的最佳设计模式
Best Design Pattern for Large Data processing methods
我有一个应用程序正在重构并尝试遵循一些 "Clean Code" 原则。我有一个应用程序可以从多个不同的数据源和 manipulates/formats 读取数据并将其插入到另一个数据库中。我有一个数据层,其中包含每个数据源的关联 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
}
你应该看看 Task Parallel Library (TPL) and 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();
您的性能将受 IO 限制,尤其是在每次迭代中对数据库进行多次访问时。因此,您需要修改架构以最小化 IO。
是否可以将所有记录移动到一起(可能在临时数据库中)作为第一遍,然后在数据库中进行记录匹配和格式化作为第二遍,然后再将它们读出并保存到哪里他们需要吗?
(附带说明一下,有时我们会被 DDD 和 OO 冲昏头脑,其中一切 "needs" 都是对象。但这并不总是最好的方法。)
我有一个应用程序正在重构并尝试遵循一些 "Clean Code" 原则。我有一个应用程序可以从多个不同的数据源和 manipulates/formats 读取数据并将其插入到另一个数据库中。我有一个数据层,其中包含每个数据源的关联 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
}
你应该看看 Task Parallel Library (TPL) and 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();
您的性能将受 IO 限制,尤其是在每次迭代中对数据库进行多次访问时。因此,您需要修改架构以最小化 IO。
是否可以将所有记录移动到一起(可能在临时数据库中)作为第一遍,然后在数据库中进行记录匹配和格式化作为第二遍,然后再将它们读出并保存到哪里他们需要吗?
(附带说明一下,有时我们会被 DDD 和 OO 冲昏头脑,其中一切 "needs" 都是对象。但这并不总是最好的方法。)