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