2010-09-16 33 views
0

我正在运行一个PHP脚本(CLI)来计算一件大事。它可能是一个(几乎)无限循环,但在17000次运行后,我的内存不足。我可以以某种方式转储一些内存(比如说每1000次运行一次),这样我可以继续运行它吗?循环中的PHP段错误

/最大

+2

你在循环什么,有什么方法批量加载数据,所以你不是一次加载它? – joshtronic 2010-09-16 20:50:24

+2

你真的需要在这里显示一些代码 – 2010-09-16 20:53:09

+2

如果你提供了一些关于你在循环中做什么的代码/细节,也许有人可以建议使用较少(或恒定)内存的方法。 – Matthew 2010-09-16 20:54:04

回答

1

在PHP 5.3中:gc_collect_cycles()

+0

谢谢,我会升级我的服务器后尝试。我会回来,如果它的工作与否 – benjick 2010-09-16 21:25:02

+0

嗯,说实话,我怀疑这种功能本身会有所帮助。 (另外,您可能首先需要'gc_enable()')。但是,PHP 5.3确实有一个改进的垃圾回收器,可以检测循环引用。这可能是你需要的;我知道这有助于我的一些长期运行的CLI脚本。所以基本上:升级PHP。如果您仍然遇到问题,请尝试使用该功能。如果它仍然存在,那么发布更多的代码......其他的东西是错误的。 – Matthew 2010-09-16 22:05:07

0

这是关于PHP内存管理的article

如果您尚未完成,您还可以increase available memory in PHP

请记住:

有时你不能只是“转储内存”。根据您的算法,您可能需要以前计算的结果以用于将来的计算。

这里的关键可能是将问题分解为更小的问题并单独解决。

查看关于Dynamic Programming的文章。

0

如果这不是服务器应用程序,我会建议将脚本分解为cron作业。

无论如何,这个问题很可能是你不小心你的变量。如果你的内存不足,那么你需要记住unset()你的变量。同样,观察你的变量范围。如果一个变量永远不会超出范围,PHP GC将无法清除它,除非您删除对它的所有引用。

+0

我一次又一次地重写一个变量。检查变量,如果不匹配重写变量并再次检查。 – benjick 2010-09-16 21:24:19

+0

你是否偶然连接这个变量?如果不是的话,PHP应该释放内存。作为一个测试,在你重新分配它的值之前,试着在这个变量上做一个unset()。我不知道这是否会有帮助,但值得一试。 – Craige 2010-09-17 18:42:55