2016-05-14 2 views
0

私は大規模なXMLファイルを処理し、それらのデータをデータベースに保存するphpスクリプトを持っています。私はいくつかのクラスを使用して処理し、データベースに保存する前にPHPスクリプトにデータを保存し、ノードごとにXMLを読み込んでメモリを保存します。 Basicalyは、私のファイルのループは次のようになります。あなたはまた、出力し、ループの最初の部分は、ファイルの進捗状況を出力し、ほとんどの出力ツールであること、3秒ごとに気づき、そしてこれは通常のメモリ動作ですか?

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 
     } 
} 

スクリプトのメモリ使用量。私はメモリ問題に遭遇したので、ファイルをアップロードしようとしていた最後の時に、メモリを食べているものが何であるかを知りたいので、それが必要です。私はそれを実行したときに、このスクリプトの出力は次のようなものに見えた

解析された15 2.0869598388672秒@ | (mem_usage:1569552 | ETA:1389.2195994059秒 解析された30 5.2812438011169 @秒|(mem_usage:1903632 | ETA:8.4330480098724秒@ 1755.1333565712秒 解析された38 |(mem_usage:2077744 | ETA:11.377414941788秒@ 2210.7901124829秒 解析された49 |(mem_usage 2649136 | ETA:2393.3931421304秒 解析された69 17.032008886337 @秒|(mem_usage:2831408 | ETA:2451.3750760901秒 解析された79 20.359696865082 @秒|(mem_usage:2968656:2428624 |:| ETA(mem_usage 14.204828023911秒@ 2310.5440017496秒 解析された59 | ETA:2556.8171214997 secs 構文解析済み87 @ 23.053930997849秒(mem_usage:3102360 | ETA:2626.8231951916秒) 構文解析済み98 @ 26.148546934128秒(mem_usage:3285096 | ETA:2642.0705279769秒s パースされた107 @ 29.092607021332秒| (mem_usage:3431944 | ETA:2689.8426286172秒

は今、私は私のMySQLオブジェクトに、私は迅速なアクセスのために、配列内のいくつかの基本的な選択クエリの結果を保存するランタイムキャッシュを持っていることを、確実に知りますこれは私が知っているスクリプトの唯一の変数であり、スクリプト全体を通してサイズが大きくなっているので、このオプションを回してみました。メモリの使用量はわずかに減少しましたが、 。スクリプト全体を通して上昇

私の質問は次のとおりです。

  1. 長時間実行されているスクリプトのメモリ使用量がゆっくりと上昇するのは、PHPの通常の動作か、コード全体を検索して、私のメモリを食べているものを見つけようとしますか?

  2. 私は変数にunset()を使用することによって、私はそれがメモリから奪うスペースを解放することができます知っているが、私は、ファイル全体を通して同じ変数を上書きしていた場合でも、私はunset()を使用する必要があります

例と私の2番目の質問のわずかな言い換え:

は、次の2つのコードブロックがより最適である1、メモリ使用量に関して同じ結果を生成、またはそうでない場合はありますか?

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

ブロック1とブロック2は同じメモリ使用量になりますが、ブロック2は$ var –

+2

の設定を解除して再作成するため遅くなります。 '長い実行スクリプト全体でメモリ使用量がゆっくりと上昇する 'ループ内の長い使用スクリプト全体での使用 "は、ループが配列などを構築している場合を除き、まれです。ループ内の何かがメモリを消費していて、解放していないようです。 –

+0

これはまさに私が。この場合、ループが使用する各関数を1つずつデバッグする必要があります。 –

答えて

0

あなたの開発マシン上でxdebugのモジュールをインストールした場合、あなたはそれが機能トレースを行うために取得することができます - それはメモリが表示されます各行の使用方法 - https://xdebug.org/docs/execution_trace

おそらく役立つでしょうスペースがどこに上がっているのかを特定します。次に、$ varなどの設定を解除して、それが何か違いがあるかどうかを調べることができます。

関連する問題