小さなログ ファイルから最大 8 ~ 10 MB のログ ファイルまで、ログ ファイルから読み込んでいます。典型的なサイズはおそらく1mbです。ここで重要なことは、私が探しているキーワードは通常、おそらく 95% の場合、ドキュメントの末尾近くにあるということです。次に、キーワードの後に 1000 文字を抽出します。
このアプローチを使用する場合:
$lines = explode("\n",$body);
$reversed = array_reverse($lines);
foreach($reversed AS $line) {
// Search for my keyword
}
以下を使用するよりも効率的ですか?
$pos = stripos($body,$keyword);
$snippet_pre = substr($body, $pos, 1000);
私が確信していないのは、stripos では一度に 1 文字ずつドキュメントの検索を開始するだけなので、理論的には、キーワードの後に 10,000 文字がある場合、それらをメモリに読み込む必要はありませんが、最初のオプションではおそらく最後の100行しか必要としない場合でも、すべてをメモリに読み込みます.100行をメモリに読み込むように変更し、最初の100行が成功しなかった場合、またはクエリが非常に軽いため実際にはそうでない場合は、別の101〜200行を検索できますか?案件。
2 番目の質問があります。これは、reverse_array が最適なアプローチであると想定しています。キーワードを見つけた後、次の 1000 文字を抽出するにはどうすればよいでしょうか。これが私の悲惨な試みです。
$body = $this_is_the_log_content;
$lines = explode("\n",$body);
$reversed = array_reverse($lines);
foreach($reversed AS $line) {
$pos = stripos($line,$keyword);
$snippet_pre = substr($line, $pos, 1000);
}
Why i don't think that will work is because each $line might only be a few hundred characters so would the better solution be to explode it every say 2,000 lines and also keep the previous $line as a backup variable so something like this.
$body = $this_is_the_log_content;
$lines = str_split($body, 2000);
$reversed = array_reverse($lines);
$previous_line = $line;
foreach($reversed AS $line) {
$pos = stripos($line,$keyword);
if ($pos) {
$line = $previous_line . ' ' . $line;
$pos1 = stripos($line,$keyword);
$snippet_pre = substr($line, $pos, 1000);
}
}
私はおそらくこれを非常に複雑にしすぎていますか?