【发布时间】:2012-11-25 09:31:24
【问题描述】:
正如标题所述,我遇到了页面文件活动高的问题。
我正在开发一个程序来处理从硬盘加载的大量图像。 它从每张图像中生成一些数据,我将其保存在列表中。对于每 3600 张图像,我将列表保存到硬盘中,其大小约为 5 到 10 MB。它以最快的速度运行,因此它最多使用一个 CPU 线程。
该程序可以运行,它会生成它应该生成的数据,但是当我在 Visual Studio 中分析它时,我收到一条警告:DA0014: Extremely high rates of paging active memory to disk。
根据任务管理器,该程序的内存消耗约为 50 MB,似乎很稳定。当我运行该程序时,我在 4 GB 中剩下大约 2 GB,所以我想我并没有用完 RAM。 http://i.stack.imgur.com/TDAB0.png
DA0014 规则描述说“例如,每秒输出的页数通常远大于每秒的页写入数。因为每秒输出的页数还包括系统文件缓存中更改的数据页。但是,确定哪个进程直接负责分页或为什么要确定并不总是那么容易。”
这是否意味着我收到此警告仅仅是因为我从硬盘驱动器中读取了很多图像,还是其他原因?不太确定我在寻找什么样的错误。
编辑:插入图片的链接。
EDIT1:每个图像大小约为 300 KB。在加载下一个之前,我会先处理每个。
更新:从实验看来,分页来自于加载大量文件。由于我不是 C# 或底层 GDI+ API 方面的专家,我不知道哪个答案最正确。我选择了 Andras Zoltans 的答案,因为它得到了很好的解释,而且他似乎做了很多工作来向像我这样的新人解释原因:)
【问题讨论】:
-
您可以尝试禁用文件缓存并重新测试以查看是否有差异。 technet.microsoft.com/en-us/sysinternals/bb897561
-
会不会是图像是使用内存映射文件读取的?如果是,那么大量的页面错误是例外行为,因为这就是有效读取图像的方式。
-
@JasonD 尝试将最大大小设置为非常低的值,但当前大小超出了它。并且程序的性能没有变化,但 Windows 确实表现得很奇怪:)
-
@Codo 据我所知,图像不是内存映射的。只是放在硬盘文件夹中的普通图片。
-
@AndersJørgensen:内存映射是一种用于读写文件的技术,而不是一种特殊类型的文件。它可以用任何文件来完成。您使用什么函数或库来读取文件?
标签: c# memory-management pagefile