У меня есть «маленькая» таблица из 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 ()