【发布时间】:2013-01-27 02:14:30
【问题描述】:
不断遇到一个 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
有什么建议可以尝试吗?
【问题讨论】:
-
您使用的是什么版本的 PHP?与 5.2 相比,PHP 5.3 显着提高了内存使用率。
-
我正在使用 5.4.11 并且正在从命令行调用脚本(如果这有什么不同的话)。
-
我不太明白这几十万次的迭代是从哪里来的。显示的while循环是否经常运行?还是整个脚本都在一个循环中?
-
@fab:整个脚本在循环中运行;否则他的 cmets(在代码中)将没有意义。
-
在两个while循环内。最外面是一个 do...while 循环,它将传入的数据分解成大块,最里面的循环遍历查询中的每一行。我必须分解最外层的块,否则较大的查询会立即杀死内存。我试图让它运行在大约 5300 万个条目的数据集上。但现在如果能完成 100 万,我会很高兴。