Мне было поручено создать приложение, которое работает с тысячами изображений, слишком много для одновременной загрузки в ОЗУ.Я предполагаю, что это несколько похоже на просмотрщик фотографий, такой как Picassa, в том, что в любой момент времени приложению требуются пиксельные данные только из нескольких каталогизированных изображений.Приложение также должно обрабатывать очень большие изображения, где для анализа или отображения изображений в любой момент времени потребуется только небольшое подмножество данных пикселей, что, как я полагаю, в некоторой степени аналогично Google Earth.Короче говоря, приложение должно динамически загружать только ту часть пиксельных данных, которая действительно требуется в любой момент времени.
Имея дело только со статической загрузкой изображений, типичной для библиотек изображений, таких как OpenCV, CImg или Magick ++, яЯ немного растерялся, как мне лучше всего подойти к проблеме.Поэтому мой вопрос: существуют ли какие-либо стандартные шаблоны проектирования для этого требования или подходы к решению этой (или аналогичной) проблемы?
Кстати, для небольших изображений я понимаю, что могу просто отложить загрузку изображенияпока это не нужно, но при таком подходе на ум приходят две ключевые проблемы.(1) Это не решает проблему большого изображения.(2) Поскольку выгрузка изображения сразу после его использования может быть неэффективной, мне понадобится некоторый тип обработчика управления памятью в приложении, который выгружает изображения только при загрузке новых изображений и превышении некоторого порога памяти.Очевидно, что аналогичная проблема управления памятью остается для частей большего изображения, загруженных в память.Я откровенно признаю, что такой инструмент находится за пределами моих знаний и опыта, поэтому, если это является преобладающим ответом на этот вопрос, то у меня есть дополнительный вопрос.Может ли кто-нибудь порекомендовать несколько базовых руководств по управлению памятью?
Спасибо за помощь!
ОБНОВЛЕНИЕ: Для тех, кому интересно, я подумаю, что поделюсь своим подходом.Класс изображения, который я создал, загружает данные изображения.Чтобы решить проблему с загрузкой тысяч изображений, я создал класс, который будет отслеживать дескрипторы файлов (в Windows есть ограничение - см. _Getmaxstdio) и объем загруженной памяти изображений, выгружая при необходимости.Для обработки очень больших изображений я использовал библиотеку изображений VXL в качестве бэк-энда, которая может загружать подраздел большого изображения.Конечно, это не так эффективно для некоторых изображений (особенно для сжатых изображений), но, поскольку я в основном работаю с мозаичными изображениями TIFF, это работает очень хорошо.