0

我有一些代码遍历从 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++;
    }
4

2 回答 2

0

要解决崩溃问题,请创建一个 .htaccess 文件并添加以下行

php_value memory_limit 256M

注意:您可以使用 2 的幂 (2* 2, 2 *3, 2**4. ...)

但是,更改内存限制正在改变问题。问题的根源在于正在使用的大量内存。如果程序有更多内存,您可能会发现程序稍后会崩溃。

尝试使用 fetchAll() 看看是否有所作为

$rows = $queryResult->fetchAll();
于 2013-09-27T22:44:06.897 回答
0

这里有两个问题:

  • 在while语句中分配......这是不好的做法,会导致问题
  • 直接对 SQL 结果集进行 foreach 迭代,即使您似乎使用了一些抽象层......这可以工作,但我不推荐它

如果您想避免内存问题(您的数据库有多大?我假设有几 GB...)您只需将结果集拆分为块(请参阅 SQL-“LIMIT”语句)或仅在您的最后一个结果已被处理 - 因此您可以在一次迭代中完成所有需要完成的事情

于 2013-09-27T21:42:23.610 回答