У меня есть то, что я предполагаю, это проблема фрагментации памяти.Фрагментация памяти WPF
Мы недавно перенесли наше приложение 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 являются верхними границами). Таким образом, для изображения 5000х6000 это 600 мб, которое должно вписываться в память просто отлично.
(Существует вероятность того, что использование маршаллинга увеличивает потребность в памяти другим N x M x 4, то есть входные и выходные изображения на стороне C#, а затем те же массивы, скопированные на сторону C++, - может быть, маршаллинг требование больше?)
Насколько фрагментирован WPF по сравнению с WinForms? Есть ли способ консолидировать память перед запуском этой обработки? Я подозреваю, что фрагментация является проблемой из-за случайного характера разломов, когда они происходят, и что это всегда проблема распределения памяти.
Или я должен полностью избегать этой проблемы, выполнив обработку как отдельный процесс, с передачей данных через сокеты или с подобной подобной вещью?
Я перешел, что код обработки много раз. Если это утечка или плохое поведение, я просто не вижу этого; но перерывы определенно начали происходить, когда мы отправились в WPF из winforms. В противном случае код идентичен. – mmr