我有我认为是内存碎片问题。
我们最近将 WinForms 应用程序移植到 WPF 应用程序。此应用程序执行一些图像处理,并且此处理始终在应用程序的 WinForms 版本中工作。我们去WPF,处理死了。调试到库中会随机出现死亡,但总是有一个为空的数组,即分配失败。
处理本身是在一个由 ap/invoke 调用的 C++ 库中完成的,并且内存相当密集;如果给定的图像是 N x M 像素大,则图像是 N x M x 2 字节大(每个像素都是无符号短,并且是灰度图像)。在处理过程中,图像金字塔在浮点空间中,因此总内存使用量将是 N x M x (2 + 2 + 4 + 4 + 4 + 4),其中第一个 2 是输入,第二个2 是输出,前 4 是浮点数的输入,第二个 4 是第 0 级差异图像,最后两个四是金字塔的其余部分(因为它们是金字塔,每个级别是每个级别的一半大小方向,这 4 个是上限)。因此,对于 5000x6000 的图像,即 600 mb,应该可以很好地放入内存中。
(使用编组可能会增加另一个 N x M x 4 的内存需求,即 C# 端的输入和输出图像,然后将相同的数组复制到 C++ 端——编组要求会更大吗? )
与 WinForms 相比,WPF 的碎片化程度如何?有没有办法在运行这个处理之前整合内存?我怀疑由于破损的随机性,当它们发生时,碎片是问题,并且它始终是内存分配问题。
或者我应该通过使处理作为一个单独的进程运行,通过套接字或类似的东西传输数据来完全避免这个问题?