菜单

php超快高效率统计大文件行数

2020年2月6日 - 金沙国际唯一官网

用php获取文件行数,网上给出的答案通常是使用file这样一次性读取,这样不适用在大文件。通常大文件大家用while来循环的逐行统计,这样的效率太慢

Linux shell逐行读取文件的方法

最快的方法是多行统计,每次读取N个字节,然后再统计行数,这样比逐行效率高多了。

 

测试情况,文件大小 3.14 GB

在Linux中有很多方法逐行读取一个文件的方法,其中最常用的就是下面的脚本里的方法,而且是效率最高,使用最多的方法。为了给大家一个直观的感受,我们将通过生成一个大的文件的方式来检验各种方法的执行效率。

第1次:line: 13214810 , time:56.2779 s;
第2次:line: 13214810 , time:49.6678 s;

方法1:while循环中执行效率最高,最常用的方法。

/*
 * 高效率计算文件行数
 * @author axiang
*/
function count_line($file){
  $fp=fopen($file, "r");
  $i=0;
  while(!feof($fp)) {
    //每次读取2M
    if($data=fread($fp,1024*1024*2)){
      //计算读取到的行数
      $num=substr_count($data,"n");
      $i+=$num;
    }
  }
  fclose($fp);
  return $i;
}

 

以上所述就是本文的全部内容了,希望大家能够喜欢。

function while_read_LINE_bottm(){

 While read LINE

 do

echo $LINE

done  < $FILENAME

}

 

       
注释:我习惯把这种方式叫做read釜底抽薪,因为这种方式在结束的时候需要执行文件,就好像是执行完的时候再把文件读进去一样。

 

方法2 : 重定向法;管道法: cat $FILENAME | while read LINE

 

Function While_read_LINE(){

 cat $FILENAME | while read LINE

 do 

echo $LINE

done

}

         
注释:我只所有把这种方式叫做管道法,相比大家应该可以看出来了吧。当遇见管道的时候管道左边的命令的输出会作为管道右边命令的输入然后被输入出来。

 

方法3: 文件描述符法

 

Function while_read_line_fd(){

Exec 3<&0

Exec 0<$FILENAME

While read LINE

Do 

 Echo $LINE

 Exec 0<&<3

}

 

        注释:
这种方法分2步骤,第一,通过将所有内容重定向到文件描述符3来关闭文件描述符0.为此我们用了语法Exec
3<&0 。第二部将输入文件放送到文件描述符0,即标准输入。

  

方法4    for  循环。

 

function  for_in_file(){

For  i  in  `cat $FILENAME`

do

echo $i

done

}

         
注释:这种方式是通过for循环的方式来读取文件的内容相比大家很熟悉了,这里不多说。

 

 

    对各个方法进行测试,看那方法的执行效率最高。

 

         
首先我们用脚本(脚本见附件)生成一个70000行的文件,文件位置在/scripts/bigfile。然后通过下面的脚本来测试各个方法的执行效率,脚本很简单,不再解释。

 

#!/bin/bash

FILENAME=”$1″

TIMEFILE=”/tmp/loopfile.out” > $TIMEFILE 

SCRIPT=$(basename $0)

 

function usage(){

echo -e “nUSAGE: $SCRIPT file n”

 

exit 1

}

 

function while_read_bottm(){

 

while read LINE

do

echo $LINE

 

done < $FILENAME

 

}

 

function while_read_line(){

 

cat $FILENAME | while read LINE

do

echo $LINE

done

 

}

 

 function while_read_line_fd(){

 

exec 3<&0

exec 0< $FILENAME

while read LINE

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图