Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 4000万页错误。如何解决这个问题?_Delphi_Page Fault - Fatal编程技术网

Delphi 4000万页错误。如何解决这个问题?

Delphi 4000万页错误。如何解决这个问题?,delphi,page-fault,Delphi,Page Fault,我有一个应用程序,从磁盘加载170个文件(假设它们是文本文件)到单个对象中,并一直保存在内存中。当我从磁盘加载这些文件时,内存分配一次。因此,不涉及内存碎片。我还使用FastMM来确保我的应用程序不会泄漏内存 应用程序将所有这些文件相互比较,以找到相似之处。过于简化了,我们可以说我们比较了文本字符串,但算法要复杂得多,因为我必须允许字符串之间存在一些差异。每个文件大约有300KB。加载到内存中(保存它的对象)需要大约0.4MB的RAM。因此,运行应用程序需要大约60MB或RAM(工作集)。它处理

我有一个应用程序,从磁盘加载170个文件(假设它们是文本文件)到单个对象中,并一直保存在内存中。当我从磁盘加载这些文件时,内存分配一次。因此,不涉及内存碎片。我还使用FastMM来确保我的应用程序不会泄漏内存

应用程序将所有这些文件相互比较,以找到相似之处。过于简化了,我们可以说我们比较了文本字符串,但算法要复杂得多,因为我必须允许字符串之间存在一些差异。每个文件大约有300KB。加载到内存中(保存它的对象)需要大约0.4MB的RAM。因此,运行应用程序需要大约60MB或RAM(工作集)。它处理数据大约15分钟。问题是它产生了超过4000万页的错误

为什么??我有大约2GB的空闲内存。据我所知,页面错误的速度很慢。他们让我的节目慢了多少? 如何优化程序以减少这些页面错误?我想这与数据局部性有关。有人知道这方面的一些示例算法吗(Delphi)

更新:
但是看看页面错误的数量(Task Manager中没有其他应用程序接近我的,甚至到目前为止),我想如果我能够优化内存布局(减少页面错误),我可以提高应用程序的速度



Delphi 7,Win 7 32位,RAM 4GB(3GB可见,2GB免费)。

警告-我只是在解决页面错误问题

我不能确定,但您是否考虑过使用内存映射文件?这样,windows将使用这些文件本身作为分页文件(而不是主分页文件pagrefile.sys)。如果文件是只读的,那么页面错误的数量理论上应该会减少,因为页面不需要通过页面文件写入磁盘,因为windows只需要根据需要从文件本身加载数据

现在,为了减少文件的传入和传出,您需要尝试以一个方向遍历数据,以便在读取新数据时,可以永远丢弃旧的页面。在这里,您可以权衡再次检查文件和缓存数据——缓存必须存储在某个地方

请注意,内存映射文件是windows加载.dll和.exe的方式。我用它们来扫描千兆字节的文件,而不会达到内存限制(在那个年代,我们有MB的内存,而不是GBs的ram)


然而,从您描述的数据来看,我建议不返回OVER文件的功能将减少正在进行的重新分页量。

在我的机器上,大多数页面错误都是针对developer studio报告的,据报告,在总CPU时间超过30分钟后,该机器出现了400万个页面错误。在一半的时间里,你会得到10倍的回报。我的系统内存不足。因此,40米的断层似乎很多

可能是你的内存泄漏了

是应用程序使用的唯一物理内存。如果你泄露了内存,不碰它,它会被调出。您将看到虚拟内存使用(或页面文件使用)的增加。当堆内存在堆中移动时,这些页可能会被调回,以便windows再次调出


因为你有很多RAM,交换出来的页面将留在物理内存中,因为没有其他人需要它们。(从RAM恢复的页面被视为软故障,从磁盘恢复的页面被视为硬故障)

是否使用指数调整系统

如果加载时内存块的增量太小,它可能会不断从系统请求大的块,复制数据,然后释放旧的块(假设fastmm(de)直接从操作系统分配非常大的块)

也许这会导致一个循环,操作系统从应用程序的进程中释放内存,然后再次添加内存,导致第一次写入时出现页面错误


还要避免对非常大的文件使用Tstringlist.load*方法,因为这些方法消耗的空间是所需空间的两倍。

@jdv-任务管理器定义的页面错误-无论这意味着什么。由于我有很多空闲RAM,硬盘LED不闪烁,我猜这是软故障。你的应用程序真的很慢,还是你只是对任务管理器中的一个数字感到恐慌?@Kelly-两者都有。它有很多微积分要做,所以它应该很慢。但同时我想提高我的应用程序的速度。我想如果我设法优化内存布局(减少页面错误),我会隐式地提高速度。@table:在这种情况下,我的建议是对代码进行基准测试,看看代码中的大部分工作是在哪里完成的。通过找出并解决实际的慢度问题,您将获得更好的性能,而不是试图更改与应用程序性能无关的数字。不,它不会泄漏。我对此非常小心。另外,我使用FastMM来捕捉泄漏。内存消耗几乎是恒定的(60MB)。那么您已经验证了应用程序的虚拟内存占用情况了吗?它不能是60米,因为它总是比工作装置大。如果您不确定我的意思,请运行processexplorer并添加虚拟大小列。从Hi Marco下载process explorer。事实并非如此。请看我(最近)更新的帖子。