我有一些代码循环遍历从DB接收的数据,但问题是内存已耗尽。我的内存限制设置为 128 MB。 为我的测试返回的总行数约为 200k。所以我不知道是数据太多,还是有没有办法缓冲表而不是一次将整个东西存储在内存中。
内存耗尽错误在 while 语句开始的行引发。
$queryResult = $dbCon->prepare( $sqlQuery );
$queryResult -> bindParam(':field1', $field1);
$queryResult -> bindParam(':field2', $field2);
$queryResult -> bindParam(':field3', $field3);
$queryResult -> execute();
$allData = array();
$i=0;
while ( $row = $queryResult->fetch(PDO::FETCH_ASSOC) )
{
foreach ( $row as $sKey=>$vVal )
{
if( $i == 0 )
{
$this->allHeaders[] = $sKey ;
}
$allData[ $i ][ $sKey ] = $vVal;
}
$i++;
}
这里有两个问题:
- while语句中的赋值...这是不好的做法,会导致问题
- 直接针对 SQL 结果集的每次迭代,即使您似乎使用了一些抽象层......这可以工作,但我不推荐它
如果你想避免内存问题(你的数据库有多大?几GB,我假设......),你只需要将结果集拆分为块(参见SQL-"LIMIT"语句)或仅在处理完最后一个结果后进行迭代 - 因此你可以在一次迭代中完成所有需要完成的事情
要解决崩溃问题,请创建一个 .htaccess 文件并添加以下行
php_value memory_limit 256M
注意:您可以使用 2 的值幂 (2*2, 2*3, 2*4.
但是,更改内存限制正在转移问题。问题的根源是正在使用的大量内存。您可能会发现,如果程序具有更多内存,则程序稍后会崩溃。
尝试使用 fetchAll(),看看是否有区别
$rows = $queryResult->fetchAll();