2010-05-31 67 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