У меня есть проблема фрагментации памяти.
Мы недавно портировали наше приложение WinForms в приложение WPF. Это приложение выполняет некоторую обработку изображений, и эта обработка всегда работала в версии приложения WinForms. Заходим в WPF, и обработка умирает. Отладка в библиотеке приводит к гибели в случайных местах, но всегда с массивом, который обнуляется, т. Е. Распределение не удалось.
Сама обработка выполняется в библиотеке C ++, вызываемой p / invoke, и требует довольно много памяти; если данное изображение имеет размер N x M пикселей, то изображение имеет размер N x M x 2 байта (каждый пиксель является коротким без знака, и это изображение в оттенках серого). Во время обработки создаются пирамиды изображений, которые находятся в плавающем пространстве, поэтому общее использование памяти будет составлять N x M x (2 + 2 + 4 + 4 + 4 + 4), где первое 2 - это вход, второе 2 - это выход, первые 4 - это входные данные в числах с плавающей запятой, вторые 4 - это изображения разности 0-го уровня, а последние две четверки - это остальная часть пирамиды (так как они являются пирамидами, и каждый уровень составляет половину размера в каждом направление, эти 4s являются верхними границами). Таким образом, для изображения размером 5000x6000 это 600 МБ, что должно прекрасно вписаться в память.
(Существует вероятность того, что использование маршаллинга увеличивает требование к памяти еще на N x M x 4, т. Е. Входные и выходные изображения на стороне C #, а затем те же массивы копируются на сторону C ++, - может быть требование маршаллинга быть больше?)
Насколько фрагментирован WPF по сравнению с WinForms? Есть ли способ консолидировать память перед запуском этой обработки? Я подозреваю, что фрагментация является проблемой из-за случайного характера поломок, когда они происходят, и что это всегда проблема выделения памяти.
Или мне следует полностью избежать этой проблемы, сделав обработку отдельным процессом, с передачей данных через сокеты или чем-то подобным?