Технологический стек: C # / .NET 4 / WinForms
Фон:
Проект, над которым я работаю, представляет собой приложение для визуализации серии стеков изображений.В частности, каждый стек изображений выровнен по сетке, показывает одно и то же изображение в любой момент времени, и функции обработки применяются к изображениям, видимым в данный момент.Сами стеки изображений составляют 150-300 МБ, а каждое изображение имеет размер 512 КБ-1 МБ.Типичный набор данных будет состоять из ~ 100 стеков изображений.
Вопрос:
Чтобы попытаться использовать этот объем данных, я использую несколько методов:
- файлы с отображением в память: стеки изображений загружаются с диска при запуске приложения
- компиляция под x64 с разрешенным небезопасным кодом: очевидно, мне нужно 64-битное адресное пространство для файлов такого размера.Я перемещаю текущее отображаемое изображение из файла отображения памяти в метод, который генерирует растровое изображение через Marshal.Copy с небезопасными указателями.
- System.Threading.Tasks: я использую параллельные циклы для обработки, где это возможно
- System.Drawing.BufferedGraphicsContext: Каждый стек изображений имеет одно активное изображение, которое перед передачей передается в BufferedGraphicsContext.в PictureBox для отображения пользователю.
- Высококачественные системные требования: четырехъядерный процессор или лучше, твердотельный накопитель, 12 ГБ памяти и т. д.
Но даже с использованием всего вышеперечисленногоОтзывчивость оставляет желать лучшего.При использовании SysInternals Process Explorer загрузка ЦП является низкой (<25%), а использование памяти возрастает до предела, прежде чем происходит сборка мусора. </p>
Профилирование показывает, что большая часть времени выполнения тратится на извлечение данных из отображенной памятифайлы.Я полагаю, что он ждет, пока ОС вернет запрошенную память обратно в активную память?
Что еще я могу сделать для повышения производительности?
Примечание:
- Большинство,если не все, стеки изображений будут доступны для просмотра одновременно, поэтому отсечение к текущему окну просмотра может не дать большой скорости.
- Изменение размера для отображения является опцией, но полные исходные данные должны все еще быть доступны в любое времядля обработки, так что кажется, что это просто дополнительный шаг.
Обновление 1:
- Для памяти, мой блок разработки имеет только 6 ГБ(в результате я пытаюсь загрузить меньше файлов), но система развертывания будет иметь 24 ГБ.
- Я изучаю возможности оптимизации SSE с помощью Intel Performance Primitives и ускорения GPU с помощью CUDA.
- Причина, по которой я пытаюсь загрузить все данные в память, заключается в том, что важным шагом визуализации является циклический переход между стеками изображений с частотой 15–60 Гц, и я боялсяshing.