降低“大”文件创建中的脚本内存使用率

时间:2010-06-15 08:32:10

标签: php

在使用PHP脚本时,我看起来遇到了典型的内存中断问题。

该脚本最初由另一个人开发,用作XML站点地图创建者,在大型网站上使用相当多的内存。

我认为问题是相关的,因为算法在内存中保存数据直到作业完成,但是挖掘代码我发现脚本以这种方式工作:

  • 在输出中打开文件(将包含XML站点地图条目)
  • 在循环中: ----对于要在站点地图中添加的每个条目,请执行fwrite
  • 关闭文件

虽然内存中没有大量的数组或变量,但这种技术会占用大量内存。

我认为也许PHP在脚本末尾缓存了fwrites和“刷新”数据,所以我修改了代码以关闭并打开每个Nth记录的文件,但是内存使用量仍然是我在计算机上调试脚本并观察内存使用情况:当脚本执行运行时,内存分配会增加。

是否有一种特殊的技术来指示PHP释放未使用的内存,强制刷新缓冲区(如果有的话)?

由于

5 个答案:

答案 0 :(得分:1)

更改解析XML文件的方式。我猜它正在将整棵树加载到内存中。

请改用event parser。我用这个处理了几千兆字节的XML文件。

答案 1 :(得分:1)

所以你正在寻找一个不是你自己编写的大型PHP程序中的内存泄漏?在检查了常见问题(加载巨大的db结果,而不是刷新/关闭文件)之后,我认为你应该使用像XDEBUG(http://xdebug.org/)这样的分析器来帮助你识别内存问题。其他任何东西都只是猜测大部分时间。我已经有过几次这种经历......

答案 2 :(得分:0)

必须有一些数据源自的地方,请仔细查看,以便在站点地图中添加每个条目部分代码。可能是同时加载了大量的DB记录集,或类似的其他东西。

无论如何,为了解决这个问题,如果你要从数据库加载数据,请尝试限制结果数量,然后循环以在数据集之后设置。

答案 3 :(得分:0)

要刷新文件缓冲区,请使用fflush()http://ch.php.net/manual/en/function.fflush.php)并释放分配给变量的空间,unset()http://ch.php.net/unset)应该这样做。

你说你试图在此过程中关闭并重新打开文件,因此冲洗缓冲区肯定不是解决方案。为什么不向我们展示一些代码,内存泄漏有时是非常不明显的?

答案 4 :(得分:0)

以下是代码:

link text

基本上