编辑:这个问题结束时的优化结果!
嗨,我有以下代码首先扫描特定文件夹中的文件,然后逐行读取每个文件,并在无数“if ... else if”之后将新修改的文件写入另一个文件夹,名称与打开时一样.
问题是逐行编写文件似乎非常缓慢。默认的 60 秒限制仅能容纳 25 个左右的文件。文件大小从 10k 到 350k 不等。
任何优化代码以使其运行得更快的方法。逐行读取是否更好,将每一行放入一个数组中,然后将整个数组写入一个新的文本文件(而不是逐行读取/写入)。如果是,它在实践中是如何完成的。
在此先感谢 ----- 代码如下 -----
<?php
function scandir_recursive($path) {
...
...
}
$fileselection = scandir_recursive('HH_new');
foreach ($fileselection as $extractedArray) {
$tableName = basename($extractedArray); // Table name
$fileLines=file($extractedArray);
foreach ($fileLines as $line) {
if(preg_match('/\(all-in\)/i' , $line)) {
$line = stristr($line, ' (all-in)', true) .', and is all in';
$allin = ', and is all in';
}
else {
$allin = '';
}
if(preg_match('/posts the small blind of \$[\d\.]+/i' , $line)) {
$player = stristr($line, ' posts ', true);
$betValue = substr(stristr($line, '$'), 1);
$bettingMatrix[$player]['betTotal'] = $betValue;
}
else if(preg_match('/posts the big blind of \$[\d\.]+/i' , $line)) {
$player = stristr($line, ' posts ', true);
$betValue = substr(stristr($line, '$'), 1);
$bettingMatrix[$player]['betTotal'] = $betValue;
}
else if(preg_match('/\S+ raises /i' , $line)) {
$player = stristr($line, ' raises ', true);
$betValue = substr(strstr($line, '$'), 1);
$bettingMatrix[$player]['betTotal'] = $betValue; //total bet this hand (shortcut)
}
else if(preg_match('/\S+ bets /i' , $line)) {
$player = stristr($line, ' bets ', true);
$betValue = substr(strstr($line, '$'), 1);
$bettingMatrix[$player]['betTotal'] = $betValue; //total bet this hand (shortcut)
}
else if(preg_match('/\S+ calls /i' , $line)) {
$player = stristr($line, ' calls ', true);
$betValue = substr(stristr($line, '$'), 1);
$callValue = $betValue - $bettingMatrix[$player]['betTotal']; //actual amount called
$bettingMatrix[$player]['betTotal'] = $betValue;
$line = stristr($line, '$', true)."\$".$callValue.$allin;
$allin = '';
}
else if(preg_match('/(\*\*\* (Flop|Turn|River))|(Full Tilt Poker)/i' , $line)) {
unset($bettingMatrix); //zero $betValue
}
else if(preg_match('/\*\*\* FLOP \*\*\*/i' , $line)) {
$flop = substr(stristr($line, '['), 0, -2);
$line = '*** FLOP *** '. $flop;
}
else if(preg_match('/\*\*\* TURN \*\*\*/i' , $line)) {
$turn = substr(stristr($line, '['), 0, -2);
$line = '*** TURN *** '. $flop .' '. $turn;
}
else if(preg_match('/\*\*\* RIVER \*\*\*/i' , $line)) {
$river = substr(stristr($line, '['), 0, -2);
$line = '*** RIVER *** '. substr($flop, 0, -1) .' '. substr($turn, 1) .' '. $river;
}
else {
}
$ourFileHandle = fopen("HH_newest/".$tableName.".txt", 'a') or die("can't open file");
fwrite($ourFileHandle, $line);
fclose($ourFileHandle);
}
}
?>
编辑:根据这里的每个人给我的提示重写代码后,这是非常有趣的结果。
60 个文本文件,共 5.8MB
经过所有优化(在循环之前更改了 preg->strpos/strstr 和 $handle):4 秒。
如上所述,但更改了 strpos/strstr -> stripos/stristr:8 秒。
如上所述,但更改了 stripos/stristr -> preg:12 秒。
如上所述,但在循环内更改了 fopen:180 秒运行限制后的 45/60 个文件
这是完整的脚本:
$fileselection = scandir_recursive('HH_new');
foreach ($fileselection as $extractedArray) {
$tableName = basename($extractedArray); // Table name
$handle = fopen($extractedArray, 'r');
$ourFileHandle = fopen("HH_newest/".$tableName.".txt", 'a') or die("can't open file");
while ($line = fgets($handle)) {
if (FALSE !== strpos($line, '(all-in)')) {
$line = strstr($line, ' (all-in)', true) .", and is all in\r\n";
$allin = ', and is all in';
} else {
$allin = '';
}
if (FALSE !== strpos($line, ' posts the small blind of $')) {
$player = strstr($line, ' posts ', true);
$betValue = substr(strstr($line, '$'), 1);
$bettingMatrix[$player]['betTotal'] = $betValue;
}
else if (FALSE !== strpos($line, ' posts the big blind of $')) {
$player = strstr($line, ' posts ', true);
$betValue = substr(strstr($line, '$'), 1);
$bettingMatrix[$player]['betTotal'] = $betValue;
}
else if (FALSE !== strpos($line, ' posts $')) {
$player = strstr($line, ' posts ', true);
$betValue = substr(strstr($line, '$'), 1);
$bettingMatrix[$player]['betTotal'] += $betValue;
}
else if (FALSE !== strpos($line, ' raises to $')) {
$player = strstr($line, ' raises ', true);
$betValue = substr(strstr($line, '$'), 1);
$betMade = $betValue - $bettingMatrix[$player]['betTotal']; //actual amount raised by
$bettingMatrix[$player]['betTotal'] = $betValue; //$line contains total bet this hand (shortcut)
}
else if (FALSE !== strpos($line, ' bets $')) {
$player = strstr($line, ' bets ', true);
$betValue = substr(strstr($line, '$'), 1);
$betMade = $betValue - $bettingMatrix[$player]['betTotal']; //actual amount raised by
$bettingMatrix[$player]['betTotal'] = $betValue; //$line contains total bet this hand (shortcut)
}
else if (FALSE !== strpos($line, ' calls $')) {
$player = strstr($line, ' calls ', true);
$betValue = substr(strstr($line, '$'), 1);
$callValue = $betValue - $bettingMatrix[$player]['betTotal']; //actual amount called
$bettingMatrix[$player]['betTotal'] = $betValue;
$line = strstr($line, '$', true)."\$".$callValue.$allin. "\r\n";
$allin = '';
}
else if (FALSE !== strpos($line, '*** FLOP ***')) {
$flop = substr(strstr($line, '['), 0, -2);
unset($bettingMatrix); //zero $betValue
}
else if (FALSE !== strpos($line, '*** TURN ***')) {
$turn = substr(strstr($line, '['), 0, -2);
$line = '*** TURN *** '.$flop.' '.$turn."\r\n";
unset($bettingMatrix); //zero $betValue
}
else if (FALSE !== strpos($line, '*** RIVER ***')) {
$river = substr(strstr($line, '['), 0, -2);
$line = '*** RIVER *** '. substr($flop, 0, -1) .' '. substr($turn, 1) .' '. $river."\r\n";
unset($bettingMatrix); //zero $betValue
}
else if (FALSE !== strpos($line, 'Full Tilt Poker')) {
unset($bettingMatrix); //zero $betValue
}
else {
}
fwrite($ourFileHandle, $line);
}
fclose($handle);
fclose($ourFileHandle);
}