2013-09-27 66 views
0

我有一些代碼循環處理從數據庫接收到的數據,但問題是內存耗盡。我的內存限制設置爲128 MB。爲我的測試返回的總行數約爲200k。所以我不知道它是否只是太多的數據,或者是否有辦法緩衝表格,而不是一次存儲整個內存。內存因PHP循環通過查詢數據而枯竭

內存耗盡錯誤在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++; 
    } 
+0

你應該問「如何處理200K(+)行」 ......與否。 – djot

+0

緩衝區是什麼?你是否同時需要所有的數據,或者你只是要處理來自每一行的東西,然後扔掉其他所有東西? –

回答

0

兩個問題在這裏:在while語句

  • 分配......那是不好的做法,將導致問題
  • 直接的foreach遍歷所有的SQL結果集,即使你似乎使用一些抽象層......這個CAN可以工作但我不會推薦它

如果你想避免內存問題(你的DB有多大?幾GB,我認爲......)你只需要n eed將結果集分成塊(參見SQL-「LIMIT」語句),或者僅在處理完最後一個結果後進行迭代 - 因此,您可以在一次迭代中完成所有需要完成的任務

0

爲了避開崩潰的問題,創建一個.htaccess文件,並添加以下行

php_value memory_limit 256M 

注意:您可以使用2(2 * 2,2 * 3,2 ** 4個值的權力。 ...)

但是,更改內存限制正在改變問題。問題的根源在於使用的海量內存。如果它有更多的內存,您可能會發現該程序稍後會崩潰。

嘗試使用使用fetchall(),看看是否有差別

$rows = $queryResult->fetchAll();