2016-05-14 2 views
0

У меня есть 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 объекта, у меня есть тайник во время выполнения, в котором хранятся результаты некоторых основных запросов на выборку в массиве, для быстрого доступа Это единственная переменная в скрипте (который я знаю), который увеличивается по размеру во всем скрипте, поэтому я попытался включить эту опцию. Использование памяти уменьшилось, но только на крошечный бит, и это было все еще . рост на протяжении всего сценария

Мои вопросы следующие:

  1. Является ли медленное увеличение использования памяти на протяжении длительного сценария нормальным поведением в php, или я должен искать весь код и пытаться выяснить, что питает мою память?

  2. Я знаю, что с помощью 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); 
+1

Block1 и Block2 будут одинаковыми для использования в памяти, но block2 будет медленнее из-за отмены и воссоздания $ var –

+2

«медленное увеличение использования памяти в течение продолжительного сценария» возможно, но «медленное увеличение памяти» использование во всем длинном запущенном скрипте внутри цикла редко, если цикл не строит массив или подобное ... похоже, что что-то внутри вашего цикла потребляет память, а не освобождает его. –

+0

Ну, это именно то, чего я боялся , В этом случае мне нужно будет отлаживать один за другим, каждую функцию, которую использует цикл: | –

ответ

0

Если вы устанавливаете модуль Xdebug на вашем компьютере, вы можете получить его, чтобы сделать функцию след - и что будет показывать память использование для каждой линии - https://xdebug.org/docs/execution_trace

Это, вероятно, поможет вы определяете, где находится пространство - вы можете попытаться отменить ($ var) и т. д. и посмотреть, не имеет ли значения какая-либо разница.

Смежные вопросы