【发布时间】:2010-03-17 11:23:15
【问题描述】:
在一个 PHP 程序中,我顺序读取一堆文件(带有file_get_contents),gzdecode 它们,json_decode 结果,分析内容,将大部分丢弃,并将大约 1% 存储在一个数组。
不幸的是,每次迭代(我遍历包含文件名的数组),似乎都会丢失一些内存(根据memory_get_peak_usage,每次大约 2-10 MB)。我已经对我的代码进行了双重和三重检查;我没有在循环中存储不需要的数据(所需的数据总体上几乎不超过 10MB),但我经常重写(实际上是数组中的字符串)。显然,PHP 没有正确释放内存,因此使用越来越多的 RAM 直到达到限制。
有没有办法进行强制垃圾回收?或者,至少,找出内存的使用位置?
【问题讨论】:
-
如果我将越来越大的数据块传递给 json_dcode() 会使用更多内存(并且不会再次释放,至少在我的测试环境中没有,但目前它没有达到内存限制)。如果在同一个 php 实例中再次解析 same 数据(相同结构的数据,不必是完全相同的变量),则不会进一步增加。您提供给 json_decode() 的 json 数据的结构、“大小”和值是否变化很大?
-
不,数据结构几乎一模一样——都是结构不变的对象数组,只是数组的长度不同。
-
memory_get_peak_usage报告一个单调递增的值——你在程序的任何时候使用的最大内存。使用memory_get_usage(true)获取当前实际使用的内存。 -
这里有一篇很好的文章解释了内存使用情况arr.gr/blog/2014/05/…