честное предупреждение: это вопрос подхода и, по крайней мере, хорошей практики ... Проблема здесь не в синтаксисе, а в подходе.
Мне приходится обрабатывать огромное количество записей оченьбыстро и предоставить преобразованный набор записей для потребителя.Мне интересно, есть ли у кого-нибудь практические предложения по наиболее эффективному способу сделать это.
Вот сценарий:
Мне нужно выполнить относительно простой набор логики: Подключение к БД -> Чтение записей -> Преобразование каждой записи -> Предоставление выходных записей для потребителя
Эта логика должна быть доступна из библиотеки - с внутренней логикой, полностью скрытой от потребителя.(Потребитель не знает, что происходит какое-то преобразование - он думает, что он просто перебирает кучу объектов).
Обычно я бы создал класс IEnumerable с помощью метода, подобного этому:
public class TransformingReader<T> where T:class,new()
{
...
...
...
public IEnumerator<T> GetEnumerator()
{
var items = _connection<dynamic>.GetData();
foreach (var item in items)
{
T transformed = _complexTask.Transform(item);
yield return transformed;
}
}
}
(использование динамического класса здесь только для иллюстрации)
Используя приведенный выше класс, потребитель:
foreach(var item in new TransformingReader<TransactionAnalysis>())
{
...
DoStuff(item);
...
}
Факты:
Я обрабатываю миллионы записей в день, поэтому объем является большой проблемой.
Функция DoStuff () пользователей может занять некоторое время.У меня нет реального способа предсказать, насколько сложной будет их работа, но она должна быть более интенсивной, чем моя работа.
Я работаю в относительно стесненных условиях - такне очень много памяти доступно и другие приложения находятся на той же машине.Итак, мне нужно вести себя ответственно.(Я не работаю на ноутбуке дедушки - но мне все еще нужно написать разумный код, который не жадный)
Мысли:
Я хочу попробовать распараллелить функцию Transform (), чтобы я мог использовать время, в течение которого DoStuff () занят, для преобразования следующих записей.Таким образом, надеюсь, я всегда (часто?) Буду готов к новой записи к тому времени, когда пользователь запросит следующую.
Я бы хотел сохранитьпростой foreach-синтаксис на стороне потребителей.Потребителю не нужно знать, что я усердно работаю за кулисами.
Любые идеи о том, как решить этот тип проблемы, будут по достоинству оценены.В частности, может быть, есть шаблон, о котором я не знаю, который мог бы помочь решить эту проблему?