PHPファイル書き込み最適化

file optimization pcre php

編集:この質問の最後に最適化の結果があります。

こんにちは、私は最初に特定のフォルダ内のファイルをスキャンしてから行ごとにすべてのファイルを読み込むために次のコードがあります。

*問題*は、ファイルを1行ずつ書くのはひどく遅すぎるようです。 デフォルトの60秒制限は、25ファイル程度で十分です。 ファイルサイズは10kから350kまでさまざまです。

実行速度を上げるためにコードを最適化するためのあらゆる方法。 1行ずつ読み込み、すべての行を1つの配列にまとめてから、その配列全体を新しいテキストファイルに書き込むほうが良いでしょうか。 行ごとに読み書きします。 もしそうなら、それは実際にどのように行われます。

事前に感謝します—–コードは続きます—–

” ” ‘

編集:ここにいるみんなが私にくれた助言に基づいてコードを書き換えた後の非常に興味深い結果がこれです。

60個のテキストファイル、合計5.8MB

すべての最適化後(preg→ strpos / strstrが変更されました)

上記のようにBUTがstrpos / strstr – > stripos / stristrを変更しました:* 8秒*

上記の通りBUTはstripos / stristr – > pregを変更しました:* 12秒*

上記のとおり、ループ内でfopenが変更されました。*実行制限180秒後のファイル数45/60

これが完全なスクリプトです。

$ fileselection = scandir_recursive( 'HH_new'); foreach($ fileselectionとしての$ extractArray){$ tableName = basename($ extractArray); //テーブル名$ handle = fopen($ extractArray、 'r'); $ ourFileHandle = fopen( "HH_newest /".$ tableName。"。txt "、 'a')または死ぬ("ファイルを開けません "); while($ line = fgets($ handle)){if(FALSE!== strpos($ line、 '(all-in)'))){$ line = strstr($ line、 '(all-in)'、true #〜msgstr "そして\ n \ n";、そしてすべてが\ r \ nにあります; $ allin = '、そしてall in'です。 } else {$ allin = ''; if(FALSE!== strpos($ line、 '$のスモールブラインドを投稿します))){$ player = strstr($ line、' posts '、true); $ betValue = substr(strstr($ line、 '$')、1); $ bettingMatrix [$ player] ['betTotal'] = $ betValue;そうでなければ(FALSE!== strpos($ line、 '$のビッグブラインドを投稿')){$ player = strstr($ line、 'posts'、true); $ betValue = substr(strstr($ line、 '$')、1); $ bettingMatrix [$ player] ['betTotal'] = $ betValue;それ以外の場合(FALSE!== strpos($ line、 'posts $')){$ player = strstr($ line、 'posts'、true); $ betValue = substr(strstr($ line、 '$')、1); $ bettingMatrix [$ player] ['betTotal'] = $ betValue;そうでなければ(FALSE!== strpos($ line、 '$にレイズ')){$ player = strstr($ line、 'raises'、true); $ betValue = substr(strstr($ line、 '$')、1); $ betMade = $ betValue  -  $ bettingMatrix [$ player] ['betTotal']; // $ bettingMatrix [$ player] ['betTotal'] = $ betValue; // FALSE!== strpos($ line、 'bets $')){$ player = strstr($ line、 'bets'、true); $ betValue = substr(strstr($ line、 '$')、1); $ betMade = $ betValue  -  $ bettingMatrix [$ player] ['betTotal']; // $ bettingMatrix [$ player] ['betTotal'] = $ betValue; // FALSE!== strpos($ line、 'calls $')){$ player = strstr($ line、 'calls'、true); $ betValue = substr(strstr($ line、 '$')、1); $ callValue = $ betValue  -  $ bettingMatrix [$ player] ['betTotal']; //実際の額は$ bettingMatrix [$ player] ['betTotal'] = $ betValue; $ line = strstr($ line、 '$'、true)。 "\ $" $ callValue。$ allin。 "\ r \ n"; $ allin = '';そうでなければ(FALSE!== strpos($ line、 '*** FLOP ***')){$ flop = substr(strstr($ line、 '[')、0、-2);設定解除($ bettingMatrix);そうでなければ(FALSE!== strpos($ line、 '*** TURN ***')){$ turn = substr(strstr($ line、 '[')、0、-2) ; $ line = '*** TURN ***'。$ flop。 \ n "; \ r \ n";設定解除($ bettingMatrix);そうでなければ(FALSE!== strpos($ line、 '*** RIVER ***')){$ river = substr(strstr($ line、 '[')、0、-2) ; $ line = '*** RIVER ***'。 substr($ flop、0、-1)。 '。 substr($ turn、1) '。 $川。 "\ r \ n";設定解除($ bettingMatrix);そうでなければ(FALSE!== strpos($ line、 'Full Tilt Poker')){unset($ bettingMatrix); //ゼロ$ betValue} else {} fwrite($ ourFileHandle、$ line); fclose($ handle); fclose($ ourFileHandle); }

  0  0


ベストアンサー

ループ内でファイルを開いたり閉じたりしているので、foreachの前にfopen()を移動し、その後fcloseを実行してみてください。

5


ここでのファイルの書き込みがパフォーマンスの問題ではないかと思います。 あなたは_すべて*で* 10 *の正規表現を実行しています。

サブストリングを見つけるために strposのようなストリングメソッドを使うことは物事をスピードアップするかもしれません。

4


あなたがそれらを strpos()または同様のものに変更することができるならば、正規表現を廃止することはあなたに最もパフォーマンスの向上をもたらすでしょう – stripos()鈍感です – 速度が上がるのに気づくはずです。

見つかった文字列は位置0にあるかもしれないので、テストは “!== false’`である必要があります。 たとえば、最初のテストケースは()になります。

if(stripos($ line、 '(all-in)')!== false){//出力を生成}

また、ファイル全体を一度に読み取る代わりにfgets()を使用すると、パフォーマンスが若干向上する可能性があります(ただし、これはメモリの問題です)。 そして他の人が言ったように、ループ内でファイルに書き込むだけで、ファイルを開いたり閉じたりしないでください。

2


これはあなたのコードにいくつかの小さな変更を加えたもので、かなり役立つはずです。

  1. `file()`から `fgets()`に切り替えました。 これにより、ファイルのすべての行ではなく、一度に1行ずつメモリにロードされます。

  2. 該当する場合は、 `preg_match()`の呼び出しを `stripos()`に変更しました。 少し早くなるはずです

  3. `$ ourFileHandle`の開閉を外側のループに移動しました。 これはファイルシステムへのstat呼び出しの数を大幅に減らし、大幅にスピードアップさせるでしょう。

その巨大なif..lseで行うことができる他の最適化はおそらく他にもたくさんあります。

$ fileselection = scandir_recursive( 'HH_new'); foreach($ fileselectionとしての$ extractArray){$ tableName = basename($ extractArray); //テーブル名$ handle = fopen($ extractArray、 'r'); $ ourFileHandle = fopen( "HH_newest /".$ tableName。"。txt "、 'a')またはdie("ファイルを開けません ");

while($ line = fgets($ handle)){if(false!== stripos($ line、 '(all-in)'))){$ line = stristr($ line、 '(all-in)'、true '、そしてオールイン' 'です。 $ allin = '、そしてall in'です。 } else {$ allin = ''; if(preg_match( '/は、$ $ [\ d \。] / i'のスモールブラインドをポストします、$ line)){$ player = stristr($ line、 'posts'、true); $ betValue = substr(stristr($ line、 '$')、1); $ bettingMatrix [$ player] ['betTotal'] = $ betValue;それ以外の場合(preg_match( '/は、$ $ [\ d \。] / i'のビッグブラインドをポストします、$ line)){$ player = stristr($ line、 'posts'、true); $ betValue = substr(stristr($ line、 '$')、1); $ bettingMatrix [$ player] ['betTotal'] = $ betValue;そうでなければ、(preg_match( '/ \ Sは/ iを上げる、$ line)){$ player = stristr($ line、'は上げる、true); $ betValue = substr(strstr($ line、 '$')、1); $ bettingMatrix [$ player] ['betTotal'] = $ betValue;そうでなければ(preg_match( '/ \ S bets / i'、$ line)){$ player = stristr($ line、 'bets'、true); $ betValue = substr(strstr($ line、 '$')、1); $ bettingMatrix [$ player] ['betTotal'] = $ betValue;そうでなければ(preg_match( '/ \ S calls / i'、$ line)){$ player = stristr($ line、 'calls'、true); $ betValue = substr(stristr($ line、 '$')、1); $ callValue = $ betValue  -  $ bettingMatrix [$ player] ['betTotal']; //実際の額は$ bettingMatrix [$ player] ['betTotal'] = $ betValue; $ line = stristr($ line、 '$'、true)。 "\ $"。$ callValue。$ allin; $ allin = '';そうでなければ(preg_match( '/(\ * \ * \ *(Flop | Turn | River))|(Full Tilt Poker)/ i'、$ line)){unset($ bettingMatrix);そうでなければ(FALSE!== stripos($ line、 '*** FLOP ***')){$ flop = substr(stristr($ line、 '[')、0、-2) ; $ line = '*** FLOP ***'。 $ flop;そうでなければ、(FALSE!== stripos($ line、 '*** TURN ***')){$ turn = substr(stristr($ line、 '[')、0、-2); $ line = '*** TURN ***'。 $ flop。 '。 $ターン;それ以外の場合(FALSE!== stripos($ line、 '*** RIVER ***')){$ river = substr(stristr($ line、 '[')、0、-2); $ line = '*** RIVER ***'。 substr($ flop、0、-1)。 '。 substr($ turn、1) '。 $川; } else {} fwrite($ ourFileHandle、$ line); fclose($ handle); fclose($ ourFileHandle); }

1


タイトルとURLをコピーしました