2010-05-31 70 views
2

我有一個帶有郵編數據的60400行「小」表,共6mb。我想遍歷它們,更新列值,然後保存它。在遍歷行集時內存不足

以下是延伸My_Db_Table認爲,一totalRows功能我郵編模型的一部分 - (60400行)

public function normalizeTable() { 
    $this->getAdapter()->setProfiler(false); 

    $totalRows = $this->totalRows();   
    $rowsPerQuery = 5; 

    for($i = 0; $i < $totalRows; $i = $i + $rowsPerQuery) { 
     $select = $this->select()->limit($i, $rowsPerQuery); 

     $rowset = $this->fetchAll($select); 
     foreach ($rowset as $row) { 
      $row->{self::$normalCityColumn} = $row->normalize($row->{self::$cityColumn}); 
      $row->save(); 
     } 
     unset($rowset); 
    } 
} 

我rowClass包含你猜對了..返回表中的行的總數規範化功能(基本上是一個metaphone包裝做一些額外的魔術)。

起初我嘗試了一個普通的舊$ this-> fetchAll(),但是馬上就出現了內存不足(128MB)。然後我試着將行集分成塊,唯一不同的是有些行實際上得到更新。但仍然出現內存錯誤。

如何,我可以acomplish任何想法,或者我應該退回到ye'olde的mysql_query()

+0

可能是一個柵欄柱條件。嘗試$ i = $ i + $ rowsPerQuery -1; – barrycarter 2010-05-31 19:20:37

+0

也許我應該提一下,我的問題是,我在分塊時仍然出現「內存不足」錯誤。 – Phliplip 2010-05-31 19:41:46

回答

1

我建議重建select語句,這樣只需要升級的列將被選中$select->from($table, (array)$normalCityColumn) ...

+1

,但安全回退選項是僅獲取所需數據(作爲數組)並使用$ this-> update($ where,$ data)更新數據庫中的值。 – 2010-05-31 20:27:51

+0

必須同意tomas.fejfar,就像我在對接受的答案的評論中提到的一樣。 – Phliplip 2010-05-31 21:03:14

+0

請注意,當然我應該只請求具體操作中使用的數據。但是必須說Zend_Db_Rowset方式不適合大型行集操作。因此fetch()和update()方法好得多。 – Phliplip 2010-05-31 21:06:10