正如标题状态,我有高页文件活动的问题。
我开发处理大量的图片,它从硬盘驱动器加载的程序。 从每一个形象它会产生一些数据,我节省了名单上。 对于每一个图像3600,我的列表保存到硬盘驱动器,其大小约为5到10 MB。 它以最快的速度,因为它可以运行,所以它最大程度的发挥一个CPU线程。
该项目工程,它产生它应该到的数据,但是当我分析它在Visual Studio中,我得到一个警告说: DA0014:分页活动内存的极高水平的磁盘 。
该程序的内存,消费特征,根据任务管理器是大约50 MB,似乎是稳定的。 当我运行程序我有大约2 GB冷落4 GB的,所以我想我不会跑出来的RAM。 http://i.stack.imgur.com/TDAB0.png
该DA0014规则描述说“的页面输出的数/秒的频率比页的数量大得多写入/秒,例如,由于页输出/秒,还包括从系统文件缓存更改数据页,但不总是容易确定哪个进程是用于寻呼或者为什么负有直接责任。”
这是否意味着我得到这样的警告,只是因为我从硬盘驱动器读取大量的图片,或者是别的什么? 真的不知道我在寻找什么样的bug进行。
编辑:链接到插入的图像。
EDIT1:将图像尺寸是各约300 KB。 我加载下一个前dipose每一个。
更新:如换页来自刚刚加载大量文件从实验看起来。 正如我在C#或潜在的GDI + API的专家,我不知道是哪的答案是最正确的。 我选择了安德拉斯Zoltans答案,因为它是很好的解释,并因为它似乎他做了很多工作来解释原因:像我这样的新人:)
更新以下更多信息
你的应用程序的工作集可能不会很大 - 但对于虚拟内存的大小? 分页可以发生,因为这不只是因为它的物理尺寸。 看到这个画面拍摄的Process Explorer在Windows 8上运行VS2012的:
而在任务管理器? 显然,私人工作为同一过程中设置的305,376Kb。
我们可以从这样的)任务管理器不一定能信任和b)应用程序的大小内存,至于操作系统方面,则要复杂得多,比我们想认为。
你可能想看看这个。
分页是因为你的文件和高最终数字做什么几乎可以肯定,因为你正在使用的文件的数量几乎可以肯定。 这方面的一个简单的测试,将尝试不同的数字文件,并生成沿着那些最终分页数字的数据集。 如果文件的数量是导致分页,然后你会看到明显的相关性。
然后拿出任何处理(但保持图像的加载),你做的,又比较 - 注意区别。
然后完全踩灭了图像加载代码 - 注意区别。
显然,你会看到在发生故障的最大跌幅时,你拿出的图像加载。
现在,看着Emgu.CV图片代码 ,它使用的Image
类内部获取图像位-这样的发动了GDI +通过函数GdipLoadImageFromFile (该指标第二个条目) )使用的系统资源来解码图像(加潜在的大字节数组) - 然后将数据拷贝到包含实际的RGB值的未压缩字节数组。
这个字节阵列使用分配GCHandle.Alloc
(也包围GC.AddMemoryPressure
和GC.RemoveMemoryPressure
)来创建一个固定的字节数组来保存图像数据(未压缩)。 现在我.Net的内存管理方面的专家,但在我看来,我们有堆碎片潜在这里,即使每个文件并行加载顺序,而不是。
这是否是导致强制分页我不知道。 但似乎有可能。
特别地,图像的内存中表示可以围绕显示而不是作为原始文件的字节被专门针对。 所以,如果我们谈论的JPEG文件,例如,然后300KB JPEG可能是在物理内存相当大,这取决于它的大小。 例如1027x768 32位图像为3MB -并且由于它的加载(第一分配)再复制(第二分配)到EMGU图像对象被布置在此之前一直对每个图像分配两次 。
但是你要问自己是否有必要找到解决问题的方法。 如果应用程序没有消耗大量的物理内存,那么就会有很多的其他应用程序的影响较小; 一个进程击中页面文件许许多多不会严重影响另一个进程还是不行,如果有足够的物理内存。
然而,它并不总是容易确定哪个进程是寻呼或者为什么负有直接责任。
魔鬼在那虎头蛇尾音符。 位图是从包含使用存储器映射文件中的像素数据的文件映射到内存中。 这是为了避免读取和数据直接从RAM写入/一种有效的方式,您只需支付您所使用。 这使得此文件与RAM同步的机制是分页。 所以,这是不可避免的,如果你处理大量的图片,那么你会看到很多的页面错误。 你只使用该工具是不够聪明,知道这是由设计。
功能,不是一个错误。
文章来源: Extremely high rates of paging active memory to disk but low constant memory usage