迭代行集时内存不足

时间:2010-05-31 19:17:04

标签: zend-framework memory-management zend-db

我有一个60400行的“小”表,带有邮政编码数据,总共6mb。我想迭代它们,更新列值,然后保存它。

以下是我的Zipcodes模型的一部分,该模型扩展了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包含一个normalize函数(基本上是一个metaphone包装器做一些额外的魔术)。

起初我尝试了一个普通的旧的$ this-&gt; fetchAll(),但是立刻得到了一个内存不足(128MB)。然后我尝试将行集拆分为块,唯一的区别是某些行实际上已更新。但仍然出现内存错误。

关于我如何能够实现这一点的任何想法,或者我应该回到ye'olde mysql_query()

2 个答案:

答案 0 :(得分:3)

我建议在这里使用Zend_Db_Statement :: fetch()函数。

http://files.zend.com/help/Zend-Framework/zend.db.statement.html

答案 1 :(得分:1)

我建议重建select语句,以便只选择需要升级的列$select->from($table, (array)$normalCityColumn) ...