J'ai ce que je suppose être un problème de fragmentation de la mémoire.Fragmentation de mémoire WPF
Nous avons récemment porté notre application WinForms dans une application WPF. Il y a un traitement d'image que cette application fait, et ce traitement a toujours fonctionné dans la version WinForms de l'application. Nous allons à WPF, et le traitement meurt. Le débogage dans la bibliothèque a la mort à des endroits aléatoires, mais toujours avec un tableau qui est annulé, c'est-à-dire que l'allocation a échoué.
Le traitement lui-même est effectué dans une bibliothèque C++ appelée par p/invoke et est assez intense en mémoire; Si l'image donnée est N x M pixels gros, alors l'image est N x M x 2 octets gros (chaque pixel est un court-métrage non signé, et c'est une image en niveaux de gris). Pendant le traitement, les pyramides d'image sont faites, qui sont dans l'espace flottant, de sorte que l'utilisation totale de la mémoire sera N x M x (2 + 2 + 4 + 4 + 4 + 4), où le premier 2 est l'entrée, le second 2 est la sortie, le premier 4 est l'entrée dans les flottants, le deuxième 4 est l'image de la différence de 0e niveau, et les deux derniers quatre sont le reste de la pyramide (car ils sont des pyramides et chaque niveau est la moitié de la taille dans chaque direction, ces 4 sont des bornes supérieures). Donc, pour une image 5000x6000, c'est 600 Mo, ce qui devrait rentrer dans la mémoire très bien.
(Il est possible que l'utilisation de marshaling augmente la mémoire requise par un autre N x M x 4, c'est-à-dire les images d'entrée et de sortie du côté C# puis les mêmes tables copiées au C++. est-ce que le besoin est plus grand?)
Est-ce que WPF est fragmenté par rapport à WinForms? Existe-t-il un moyen de consolider la mémoire avant d'exécuter ce traitement? Je soupçonne que la fragmentation est le problème en raison de la nature aléatoire des ruptures, quand elles se produisent, et que c'est toujours un problème d'allocation de mémoire.
Ou devrais-je éviter complètement ce problème en faisant fonctionner le traitement comme un processus séparé, avec le transfert de données via des sockets ou quelque chose de similaire?
Je suis allé sur ce code de traitement plusieurs fois. S'il fuit ou se comporte mal, je ne le vois pas; mais les pauses ont vraiment commencé à se produire lorsque nous sommes allés à WPF à partir de winforms. Le code est par ailleurs identique. – mmr