Недостаточно памяти во время перебора набора строк - PullRequest
2 голосов
/ 31 мая 2010

У меня есть «маленькая» таблица из 60400 строк с данными почтового индекса, всего 6 МБ. Я хочу перебрать их все, обновить значение столбца, а затем сохранить его.

Следующее является частью моей модели 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 содержит функцию нормализации (в основном, обертка метафона, выполняющая некоторые дополнительные действия).

Сначала я попробовал обычный старый $ this-> fetchAll (), но сразу получил нехватку памяти (128 МБ). Затем я попытался разбить набор строк на куски, с той лишь разницей, что некоторые строки действительно обновляются. Но все равно выходит из памяти ошибка.

Любые идеи о том, как я могу это сделать, или я должен вернуться к ye'olde mysql_query ()

Ответы [ 2 ]

3 голосов
/ 31 мая 2010

Я предложу здесь использовать функцию Zend_Db_Statement :: fetch ().

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

1 голос
/ 01 июня 2010

Я предлагаю перестроить оператор выбора так, чтобы были выбраны только столбцы, которые необходимо обновить $select->from($table, (array)$normalCityColumn) ...

...