作者bobju (宝贝猪)
看板PHP
标题Re: [请益] PHP读取.txt档的速度
时间Thu Mar 3 17:03:01 2011
PHP读档速度飞快好不好? 你在程式当中应该是写了什麽奇怪的code.
※ 引述《linbob09 (累毙了)》之铭言:
: 最近在用PHP写读档的东西,觉得读取档案内容的速度非常的慢
: 档案的内容例子如下:
: .
: .
: .
: 一下 2
: 一下这 3
: 一下这一 4
: 一下这一叠 3
: .
: .
: .
: 这样的内容大约有1万行,大小183K
: 但是读取的时间却花了约44秒左右,有时候甚至会7X秒,让我感到不可思议
: 读档的code如下:
: $Handle = fopen($FileLocation,"r+");
: while(!feof($Handle)){
: $FileContent[] = fgets($Handle);
^^ 这种写法是把 $FileContent 当成 array,
每次读到的内容塞入一个新的entry,
以後每次处理 $FileContent 这个变数,
都会把旧内容再次蹂躏一遍,
时间复杂度是 O(n^2),
你确定这是你所要的结果?
搭配以下的程式码一起看, 我就觉得这行怪怪的.
会[习惯]这麽写, 可能跟刚从c语言转过来有关,
只是PHP处理字串的习惯, 在这里跟c语言稍微有
点不一样.
另外, 可以使用print_r()这个函式除错, 例如:
print_r($FileContent);
你就可以观察看看其内容是否符合你的预期.
: $FileContent = str_replace("\xef\xbb\xbf","",$FileContent);//BOM清除
^^^^^^^^^^^^ 跟上一行相比, $FileContent究竟是要当做
一般的变数用? 还是当成array用? 显然就有问题了.
承 weiyucsie 所言, 接下来稍微改一下程式:
假设此程式其它部份的逻辑都没问题(其实我对 $i 未初始化就直接用是有点意见,
但在此看来无妨),稍微改一下应该就可以改善整体处理效能. 以上两行:
$FileContent[] = fgets($Handle);
$FileContent = str_replace("\xef\xbb\xbf","",$FileContent);
改成:
$tmp = fgets($Handle);
$FileContent[] = str_replace("\xef\xbb\xbf","",$tmp);
即可.
如果还会有问题, 那麽我建议:
1 先从档案当中把所有内容读进来,
2 再一行一行处理,
分两阶段进行, 程式的架构会比较乾净.
: //读出重复次数(0-9999)
: preg_match("/\d\d\d\d|\d\d\d|\d\d|\d/",$FileContent[$i],$Match);
: $Multiplicity[] = $Match[0];
: //读出次数END
: //取出中文字
: $FileContent[$i] = str_replace(" ",".",$FileContent[$i]);
: $Mode1 = "/[.]/";//以.分段
: $Content = preg_split($Mode1,$FileContent[$i],-1);
: $FileContent[$i] = $Content[0];
: //取出中文字END
: $i++;
: }
: fclose($Handle);
: 会不会是在preg_match占用太多时间吗?
: 还是有其他方法能够增加读档案的速度...
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 115.43.11.116
※ 编辑: bobju 来自: 115.43.11.116 (03/03 17:09)
※ 编辑: bobju 来自: 115.43.11.116 (03/03 17:36)
1F:推 linbob09:受教了... 03/03 17:43
2F:→ weiyucsie:看下来$FileContent应该是array 03/03 23:33
3F:→ weiyucsie:str_replace把整个$FileContent array都处理一遍 03/03 23:33
※ 编辑: bobju 来自: 115.43.11.116 (03/04 00:12)
※ 编辑: bobju 来自: 115.43.11.116 (03/04 00:17)
4F:→ kylekai:把整个档案读入 Array 用 file() 比较快吧.. 03/04 09:43
5F:推 Jerr:@楼上 file return an array 但是不会去除EOL (\r\n) 03/04 09:57
6F:→ Jerr:看需求喽 我习惯file_get_contents然後explode by EOL 03/04 09:57
7F:→ kylekai:我会在要处理的时候才去把不要的那个EOL处理掉.XD 03/04 15:33