Я продолжаю получать эту ошибку при запуске одного из моих сценариев;
Неустранимая ошибка PHP: исчерпан допустимый объем памяти 1073741824 байта (попытался выделить 71 байт) в ... lib / symfony-1.4.11 / lib / plugins / sfDoctrinePlugin / lib / vendor / doctrine / Connection / Statement.php в строке 246, ...
Ниже приведена сокращенная версияскрипт, который вызывает ошибку;
public function executeImportFile(sfWebRequest $request)
{
ini_set('memory_limit', '1024M');
set_time_limit ( 0 );
//more codes here...
$files = scandir($workspace.'/'.$directory);
foreach ($files as $file) {
$path = $workspace.'/'.$directory.'/'.$file;
if ($file != "." && $file != "..") {
$this->importfile($path);
}
}
}
protected function importfile($path){
$connection =
sfContext::getInstance()->getDatabaseManager()->getDatabase('doctrine')->getDoctrineConnection();
$connection->beginTransaction();
try {
//more codes here...
while ($data = $reader->read()) //reads each line of a csv file
{
// send the line to another private function to be processed
// and then write to database
$this->writewave($data);
}
$connection->commit();
} catch (Exception $e) {
$connection->rollback();
}
}
Что скрипт делает в основном, чтобы прочитать все файлы CSV в папке (которая содержит десятки тысяч строк в каждом), обработать его и записать его вбазы данных с использованием транзакции Doctrine.
Хотя я не думаю, что мне нужно устанавливать ограничение памяти и ограничение времени в обеих функциях, сценарий завершается, поскольку Doctrine использует все выделенные 1 ГБ памяти.
Обычно он останавливается после обработки 10 файлов, а выделение большего объема памяти позволяет обрабатывать немного больше файлов и все равно приводит к сбою.
Есть что-то, что я пропускаюЧто здесь, что заставляет память не освобождаться после обработки каждого файла?
Мохд Шакир Закария http://www.mohdshakir.net