当前位置 : 主页 > 编程语言 > delphi >

德尔福 – 4000万页面错误.如何解决这个问题?

来源:互联网 收集:自由互联 发布时间:2021-06-23
我有一个应用程序,从单个对象的磁盘加载170个文件(假设它们是文本文件),并一直保存在内存中.从磁盘加载这些文件时,内存分配一次.因此,不涉及内存碎片.我还使用FastMM来确保我的应用
我有一个应用程序,从单个对象的磁盘加载170个文件(假设它们是文本文件),并一直保存在内存中.从磁盘加载这些文件时,内存分配一次.因此,不涉及内存碎片.我还使用FastMM来确保我的应用程序永远不会泄漏内存.

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

为什么?我有大约2GB的可用内存.据我所知,Page Faults很慢.他们放慢了我的计划多少钱?
如何优化程序以减少这些页面错误?我想这与数据局部性有关.有没有人知道一些这方面的算法(Delphi)?

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

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

警告 – 我只是解决页面错误问题.

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

现在要减少来自分页的文件,你需要尝试在一个方向上浏览数据,以便在读取新数据时,可以永久丢弃旧页面.这里是您再次浏览文件和缓存数据的地方 – 缓存必须存储在某处.

请注意,内存映射文件是Windows加载.dlls和.exes等的方式.我已经用它们来扫描gigabyte文件而没有达到内存限制(那时候我们有MB而不是GB的ram).

但是,根据您描述的数据,我建议不要返回ovver文件的能力会减少正在进行的重复播放量.

网友评论