У меня есть php-скрипт, который обрабатывает большие XML-файлы и сохраняет данные из них в базу данных. Я использую несколько классов для обработки и хранения данных в PHP-скрипте перед сохранением в базе данных и чтения в XML, узел за узлом, для сохранения памяти. Basicaly, петля в мой файл выглядит следующим образом:Это обычное поведение памяти?
while ($Reader->read()) {
$parsed++;
if (time() >= $nexttick) {
$current=microtime(true)-$ses_start;
$eta=(($this->NumberOfAds-$parsed)*$current)/$parsed;
$nexttick=time()+3;
$mem_usage=memory_get_usage();
echo "Parsed $parsed @ $current secs \t | ";
echo " (mem_usage: " . $mem_usage . " \t | ";
echo "ETA: $eta secs\n";
}
$node=$Reader->getNode();
// OMMITED PART: $node is an array, I make some processing, and check if everything exists in the array that I need in the following section
$Ad=new Ad($node); // creating an Ad object from the node
// OMMITED PART: Making some additional SQL queries, to check the integrity of the data, before uploading it to the database
if (!$Ad->update()) {
//add wasn't inserted succesfully, saving a row in a second database table, to log this information
} else {
//add succesfully inserted, saving a row in a second database table, to log this information
}
}
Вы заметили, что первая часть цикла, это маленький инструмент вывода, который выводит прогресс файла, каждые 3 секунды, а также выходы использование памяти сценария. Мне нужно это, потому что я столкнулся с проблемой памяти, в последний раз, когда я пытался загрузить файл, и хотел выяснить, что уберет память.
Вывод этого сценария посмотрел что-то вроде этого, когда я побежал:
разобранного 15 @ 2.0869598388672 секунд | (Mem_usage: 1569552 | ETA: 1389.2195994059 сек Parsed 30 @ +5,2812438011169 секунд | (mem_usage: 1903632 | ETA: 1755.1333565712 сек Parsed 38 @ +8,4330480098724 сек | (mem_usage: 2077744 | ETA: 2210.7901124829 сек Parsed 49 @ +11,377414941788 секунд | (mem_usage : 2428624 | ETA: 2310.5440017496 сек Parsed 59 @ +14,204828023911 секунд | (mem_usage: 2649136 | ETA: 2393.3931421304 сек Parsed 69 @ 17,032008886337 секунд | (mem_usage: 2831408 | ETA: 2451.3750760901 сек Parsed 79 @ +20,359696865082 секунд | (mem_usage: 2968656 | ETA: 2556.8171214997 secs Размещено 87 @ 23.053930997849 secs | (mem_usage: 3102360 | ETA: 2626.8231951916 secs Размещено 98 @ 26.148546934128 secs | (mem_usage: 3285096 | ETA: 2642.0705279769 sec s Parsed 107 @ 29.092607021332 secs | (Mem_usage: 3431944 | ETA: 2689.8426286172 сек
Теперь я знаю, для определенности, что в моем MySQL
объекта, у меня есть тайник во время выполнения, в котором хранятся результаты некоторых основных запросов на выборку в массиве, для быстрого доступа Это единственная переменная в скрипте (который я знаю), который увеличивается по размеру во всем скрипте, поэтому я попытался включить эту опцию. Использование памяти уменьшилось, но только на крошечный бит, и это было все еще . рост на протяжении всего сценария
Мои вопросы следующие:
Является ли медленное увеличение использования памяти на протяжении длительного сценария нормальным поведением в php, или я должен искать весь код и пытаться выяснить, что питает мою память?
Я знаю, что с помощью
unset()
на переменном, я могу освободить место, которое он берет из памяти, но мне нужно использоватьunset()
даже если я перезапись те же переменный в течение всего файла?
Незначительное перефразировка второй вопрос на примере:
Существуют следующие два кодовых блоков дают одинаковый результат относительно использования памяти, или если нет, что один является более оптимальным?
block1
$var = str_repeat("Hello", 4242);
$var = str_repeat("Good bye", 4242);
block2
$var = str_repeat("Hello", 4242);
unset($var);
$var = str_repeat("Good bye", 4242);
Block1 и Block2 будут одинаковыми для использования в памяти, но block2 будет медленнее из-за отмены и воссоздания $ var –
«медленное увеличение использования памяти в течение продолжительного сценария» возможно, но «медленное увеличение памяти» использование во всем длинном запущенном скрипте внутри цикла редко, если цикл не строит массив или подобное ... похоже, что что-то внутри вашего цикла потребляет память, а не освобождает его. –
Ну, это именно то, чего я боялся , В этом случае мне нужно будет отлаживать один за другим, каждую функцию, которую использует цикл: | –