Лучший шаблон проектирования для методов обработки больших данных - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть приложение, которое я занимаюсь рефакторингом и пытаюсь следовать некоторым принципам «чистого кода». У меня есть приложение, которое считывает данные из нескольких различных источников данных и обрабатывает / форматирует эти данные и вставляет их в другую базу данных. У меня есть уровень данных со связанными 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
}

Ответы [ 2 ]

1 голос
/ 12 апреля 2019

Вы должны заглянуть в 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();
0 голосов
/ 12 апреля 2019

Ваша производительность будет зависеть от ввода-вывода, особенно с учетом большого количества обращений к базе данных в каждой итерации.Поэтому вам необходимо пересмотреть свою архитектуру, чтобы минимизировать число операций ввода-вывода.

Можно ли переместить все записи ближе друг к другу (возможно, во временной базе данных) в качестве первого прохода, а затем выполнить сопоставление и форматирование записей в базе данныхв качестве второго прохода, прежде чем прочитать их и сохранить их там, где они должны быть?

(Как примечание: иногда мы увлекаемся DDD и OO, где все «должно» быть объектом.Но это не всегда лучший подход.)

...