Нужен совет, лучшая практика и т.д ...
Технология: C # .NET4.0, Winforms, 32 бит
Я ищу несколько советов о том, как лучше всего справиться с обработкой больших данных в моем приложении C # Winforms, которое испытывает высокое использование памяти (рабочий набор) и случайное исключение OutOfMemory.
Проблема в том, что мы выполняем большой объем обработки данных «в памяти», когда открывается «корзина покупок». В упрощенном виде, когда загружена корзина покупок, мы выполняем следующие расчеты:
Для каждого элемента в «корзине покупок» извлекается его историческая цена, начиная с даты, когда товар впервые появился в наличии (это могут быть данные за два месяца, два года или два десятилетия). Исторические ценовые данные извлекаются из текстовых файлов, через Интернет, любого формата, который поддерживается плагином цены.
Для каждого товара, для каждого дня с момента его появления на складе рассчитывают различные метрики, которые строят исторический профиль для каждого товара в корзине.
В результате мы можем выполнить сотни, тысячи и / или миллионы вычислений в зависимости от количества товаров в «корзине покупок». Если в корзине слишком много товаров, мы рискуем попасть в исключение «OutOfMemory».
Несколько предостережений ;
Эти данные необходимо рассчитать для каждого товара в «корзине покупок», и данные хранятся до тех пор, пока «корзина покупок» не будет закрыта.
Несмотря на то, что мы выполняем шаги 1 и 2 в фоновом потоке, скорость важна, так как количество товаров в «корзине покупок» может значительно повлиять на общую скорость расчета.
Память извлекается сборщиком мусора .NET при закрытой «корзине покупок». Мы профилировали нашу заявку и гарантируем, что все ссылки правильно расположены и закрыты, когда корзина закрыта.
После завершения всех вычислений результирующие данные сохраняются в IDictionary. «CalculatedData - это объект класса, свойства которого представляют собой отдельные метрики, рассчитанные с помощью вышеуказанного процесса.
Некоторые идеи, о которых я думал;
Очевидно, что моей главной задачей является уменьшение объема памяти, используемой для расчетов, однако объем используемой памяти может быть уменьшен только в том случае, если я
1) уменьшить количество метрик, рассчитываемых на каждый день или
2) уменьшить количество дней, используемых для расчета.
Оба эти варианта недействительны, если мы хотим выполнить наши бизнес-требования.
Файлы с отображением в памяти
Одна идея состояла в том, чтобы использовать отображенные в памяти файлы, которые будут хранить словарь данных. Будет ли это возможно / выполнимо, и как мы можем поставить это на место?
Использовать временную базу данных
Идея состоит в том, чтобы использовать отдельную (не в памяти) базу данных, которая может быть создана для жизненного цикла приложения. Когда «корзины покупок» открыты, мы можем сохранить рассчитанные данные в базе данных для повторного использования, что устраняет необходимость пересчета для той же «корзины покупок».
Есть ли другие альтернативы, которые мы должны рассмотреть? Что является наилучшей практикой, когда дело доходит до расчетов с большими данными и их выполнения вне оперативной памяти?
Любой совет приветствуется ....