2017-08-26 23 views
-1

私はこのコードを35秒実行しました。どのように実行時間を短縮するには?私はこのソースコードで何を変えるべきですか?ループ実行時間を短縮

$file_handle = fopen("WMLG2_2017_07_11.log", "r"); 
while (!feof($file_handle)) { 
    $line = fgets($file_handle); 
    if (strpos($line, '[email protected] [WMLG2] >') !== false) { 
     $namafileA = explode('> ', $line); 
     $namafile = str_replace(' ', '_', $namafileA[1]); 
     $filenameExtension = $namafile.".txt"; 
     $file = preg_replace('/[^A-Za-z0-9\-_.]/', '', $filenameExtension); // hapus special character kecuali "." dan "_" 
    } else { 
     $newfile = fopen("show_command_file_Tes2/$file", "a"); 
     fwrite($newfile, $line); 
    } 
} 
fclose($file_handle); 

答えて

0

パフォーマンスに影響を与える可能性のある元のコードでいくつかの間違いを発見しましたが、その程度はわかりません。

私が正しく理解していれば、ログファイルを開き、メッセージを別々のファイルに並べ替えることになります。

ログファイルからサンプルを貼り付けたわけではありませんが、ファイルターゲットが重複していると仮定します。ログファイルの各行に個別のファイルターゲットがあるわけではありません。

コードは開きますが、ハンドルを閉じることはなく、スクリプトの実行中は開いたままです。ファイルハンドルがガベージコレクタによって外側のスコープで閉じるのではなく、手動でリソースを解放する必要があります。

これに基づいて、ファイルポインタを格納するか(少なくともそれらを閉じて)、すでに開いているものを再利用する必要があります。実行中に少なくともX行のハンドルを開いていて、閉じていない/再利用しています(Xはファイル内の行数です)。

私が気付いたことは、あなたの行は長いものかもしれません。phpのstrpos()関数が文字列の正しい位置に一致する正規表現よりも遅くなることはまれなケースです。ログファイルがなければ、preg_match()はシンプル/ショートストリングでかなり高価な機能なので、私は確かに言えません。

ログファイルが "root @ CLA" ...文字列の場合、文字列の位置を^(文字列の先頭)または$(文字列の最後)と指定することができます。あなたのコードから

<?php 

$file_handle = fopen("WMLG2_2017_07_11.log", "r"); 

//you 'll store your handles here 
$targetHandles = []; 

while (!feof($file_handle)) 
{ 
    $line = fgets($file_handle); 
    if (strpos($line, '[email protected] [WMLG2] >') !== false) 
    { 
     $namafileA = explode('> ', $line); 
     $namafile = str_replace(' ', '_', $namafileA[1]); 
     $filenameExtension = $namafile . ".txt"; 
     $file = preg_replace('/[^A-Za-z0-9\-_.]/', '', $filenameExtension); // hapus special character kecuali "." dan "_" 
    } 
    else 
    { 
     //no $file defined, most likely nothing to write yet 
     if (empty($file)) 
     { 
      continue; 
     } 

     //if its not open, we'll make them open 
     if (empty($targetHandles[$file])) 
     { 
      $targetHandles[$file] = fopen("show_command_file_Tes2/$file", "a"); 
     } 
     //writing the line to target 
     fwrite($targetHandles[$file], $line); 
    } 
} 

//you should close your handles every time 
foreach ($targetHandles as $handle) 
{ 
    fclose($handle); 
} 

fclose($file_handle); 
+0

、変数$ファイル未定義ここ そのログファイルを、あなたがそれを見たい場合は https://www.dropbox.com/s/z8tvmegokghrjok/WMLG2_2017_07_11.log?dl=0 @Fiber –

+0

はい、あなたは正しいですが、その変数の意図が分からず、 '$ file = preg_replace( '/ [^ A-Za-z0-9 \ -_]に定義しています。/'、' '、$ filenameExtension); // hapus特殊文字kecuali "。" dan "_" ')'しかし、それは未定義である可能性があります。投稿を編集して修正しましょう。 – Fiber

+0

$ file = preg_replace( '/ [^ A-Za-z0-9 \ - 。] /'、 '$ filenameExtension)私はそれが定義されていない場合、ファイル名は ex:show_alarm_active .txt 拡張子を置く前に最後の文字列にスペースがあります。 –

関連する問題