4

不断遇到 PHP 脚本的奇怪问题。该脚本的想法是从 MySQL 表中获取一堆数据,对其进行处理,比较另一个表中的一些数据,然后将结果打印到 CSV 格式的文件中。

该脚本将运行数十万次迭代才能完成。我遇到的问题是,即使在数组上使用 unset() 并在我的 MySQL 查询上使用 free() ,内存仍会继续使用,直到迭代 350,000 左右,内存不足。

毫无疑问,每次我运行脚本时,memory_get_usage() 报告的内存分配保持不变,直到大约 1050 次迭代。然后它将恰好增加 262,144 字节。通过测试,它也总是在脚本中完全相同的位置递增。在下面的代码块中,它将始终在 b2a 的迭代之一中递增(最多 4 次可能的迭代)。

//up here we get the data to run analysis/comparisons on.

echo "{$lineCounter}b:  " . memory_get_usage(TRUE) . "\n"; //27525120
if ($AttResults = $db_cx->query($ObsAttQuery)) {
   echo "{$lineCounter}b1:  " . memory_get_usage(TRUE) . "\n"; //27525120
   $attArray = array();
   echo "{$lineCounter}b2: " . memory_get_usage(TRUE) . "\n"; //27525120
   while ($attRow = $AttResults->fetch_object()) {
      echo "{$lineCounter}b2a {$attRow->attId}: " . memory_get_usage(TRUE) . "\n"; //27787264
      $attArray[$attRow->attId] = $attRow->value;
   }
echo "{$lineCounter}b3: " . memory_get_usage(TRUE) . "\n"; //27787264
$AttResults->free();
if (empty($attArray)) continue;

//down here after it is done I have an unset on the $attArray variable

有什么建议可以尝试吗??

4

2 回答 2

0

在 5.3 版本之前,php 有一个非常愚蠢的垃圾收集器:PHP 5 中的 Memory Leaks With Objects。有了这个,你甚至无法释放你的记忆unset()。您必须在取消设置之前打破循环引用,或者至少使用 php 5.3。

于 2013-02-11T21:59:03.980 回答
0

您是否查看了通过以下方式检索的数据:

$attRow = $AttResults->fetch_object()

在迭代 1050 之前/前后?

...而且...是的,我会在循环之前更改分配,在循环之前进行一次获取,在结束之前进行一次获取以查看内存是否更改。

于 2013-02-13T01:10:32.387 回答