У меня есть рекурсивная функция для перебора 11 миллионов записей базы данных, по 1000 за раз. Когда он приблизился к 9М, он остановился. Мое предположение о проблеме с памятью подтвердилось, когда я отображал get_memory_usage()
после каждых 1000 записей.
Функция работает примерно так:
<?
get_data_block();
function get_data_block($id=0);
{
//open a csv file for writing
$packages_sorted_csv=fopen("./csv/packages_sorted.csv", "a");
//get 1000 records and process them
//$unsorted = array of 1000 records from database
foreach($unsorted as $row);
{
$ct++;
$id++;
//$packages_sorted = array of processed data
//write output
fputcsv($packages_sorted_csv, $packages_sorted);
}
fclose($packages_sorted_csv);
if($ct==1000)
{
unset($unsorted);
echo 'Mem usage: '.memory_get_usage();
get_data_block($id); //call the function again
}else{
//finished
}
}
?>
У кого-нибудь есть совет, как освободить все ресурсы с рекурсивными функциями?
... или есть способ вызвать ту же функцию снова, чтобы она не вызывалась сама по себе?
Примечания:
- Мне нужно разбить данные на блоки, чтобы освободить занятый сервер MySQL.
- Я попытался сбросить все определенные переменные, которые не входят в глобальную область.
- Единственное, что я не могу сбросить, это ресурс fopen.
- Объем памяти увеличивается примерно на 400 КБ за каждую итерацию.