有关php二种字符串连接的频率比较,有规律大文件的读取与写入的辨析

正文实例讲述了PHP获取文件行数的艺术。分享给大家供大家参考。具体分析如下:
提供两种已毕形式,就算第二种简单易懂,但是首先种功能最好
有关php二种字符串连接的频率比较,有规律大文件的读取与写入的辨析。第一种:

php大约有二种字符串连接:

这几天在做一个东西.商讨PHP读取行数较多的公文(大致上百万行).考虑到功能难点.进行了简要的切磋.统计如下

使用FileInputStream读取文件数量的时候怎么读取效能是最高?

澳门葡京备用网址,运用字节数组作为缓冲区读取的频率是最高的。

大家精通使用缓冲字节数组读取文件的效用最高,sun也知道使用缓冲字节数组读取的成效高,那时候sun为了有利于我们
做事,编写一个缓冲输入字节流给自己去行使,

<?php 
$file_path = 'xxx.txt'; //文件路径 
$line = 0 ; //初始化行数 
//打开文件 http://www.manongjc.com/article/1330.html
$fp = fopen($file_path , 'r') or die("open file failure!"); 
if($fp){ 
//获取文件的一行内容,注意:需要php5才支持该函数; 
while(stream_get_line($fp,8192,"\n")){ 
$line++; 
} 
fclose($fp);//关闭文件 
} 
//输出行数; 
echo $line; 
?>

1、直接用.来拓展再三再四。

先是条.file()函数的频率难题.

缓冲输入字节流的法力:

增强大家读取文件数量的频率。

 

2、用.=举行连接。

file()函数的功能很底下
假诺是有规律的文件.比如每行一条相应数据.那么尽量不假如用file()函数

输入字节流的系统:

———-| InputStream 抽象类 所有输入字节流的基类
————–| FileInputStream 读取文件数量的输入字节流
————–|BufferedInputStream 缓冲输入字节流
该类的原形实际上只是在里头维护了一个8kb的字节数组而已。
重即使为了加强大家的读取文件 的频率。

凡是缓冲流都未曾读写文件的能力,在利用之读写多少的时候,其实都以凭借着其绑定的FileInput/OutputStream

第二种:

3、先压入数组,再经过join函数连接。

可以应用file_get_contents()然后用explode切割.那样作用会快三分之一

BuffereInputStream注意的事项:
  1. BuffereInputStream
    的close方法其实关闭的就是你传递进入的FileInputStream对象。

public class Demo1 {

    public static void main(String[] args) throws IOException {
        //readTest();
    }

    public static void readTest() throws  IOException {
        //第一步:找到目标文件
        File file = new File("F:\\a.txt");
        //第二步:建立文件与程序的输入通道
        FileInputStream fileInputStream = new FileInputStream(file);
        //第三部:建立缓冲输入字节流
        /*
            疑问: 为什么创建BufferedInputStream对象需要传入一个InputStream的对象呢?
                BufferedInputStream没有读取文件 数据的能力,但是又要读取文件的数据,这时候只能依赖一个具备
                读取文件数据能力的对象。

         */
        BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
        //读取文件数据
        int content = 0; 
        /*
            疑问: BufferedInputStream 的read方法每次只是读取一个字节的数据,FileInputStream的read方法每次也是读取一个字节的数据
            那么为什么说BufferedInputStream提高了读取的效率呢?
         */
        while((content = bufferedInputStream.read())!=-1){
            System.out.print((char)content);
        }

        //关闭资源   
        bufferedInputStream.close();
    }

    //不使用缓冲流读取的(据说这种方式效率更高)
    public static void readTest2() throws IOException{
        //第一步:找到目标文件
        File file = new File("F:\\a.txt");
        //第二步:建立文件与程序的输入通道
        FileInputStream fileInputStream = new FileInputStream(file);
        byte[] buf = new byte[8192];
        int length = 0 ; 
        while((length = fileInputStream.read(buf))!=-1){
            System.out.println(new String(buf,0,length));
        }
        fileInputStream.close();

    }
}
<?php 
//http://www.manongjc.com/article/1330.html
$line = count(file('filename')); 
echo $line; 
?>

上边分别对那三种方法的频率展开测试:

举个例子:

查阅BufferedInputStream内部结构
public synchronized int read() throws IOException {
        if (pos >= count) {
            fill();
            if (pos >= count)
                return -1;
        }
        return getBufIfOpen()[pos++] & 0xff;
    }
}

/**
*  仅仅就是返回了buf而已
*/
private byte[] getBufIfOpen() throws IOException {
        byte[] buffer = buf;
        if (buffer == null)
            throw new IOException("Stream closed");
        return buffer;
    }
}

/*
pos    :当前读取buffer[]指向的位置
count  :当前buffer[]的容量
buf    :BufferedInputSteam中维护的缓存区buffer[]

过程是:
使用该read()函数,其内部会先从文件中尽量读取8kb数据来填充其维护的buffer[];
然后再依次返回该buffer[]中的一个字节,直到buffer[]被读完,再循环从文件中读取数据........
*/

第三种艺术因为要保留文件的始末,效能上会很差

率先种办法代码如下:

文本样式如下:

缓冲输出字节流: 为了进步写文件的频率。

———| OutputStream 抽象类, 所有出口字节流的基类。
————-| FileOutputStream 向文件写出多少的输出字节流对象。
————-| BufferedOutputStream 缓冲输出字节流,
为了增加写文件数量的频率。

<?php   
   function get_tm() {
   list ( $usec, $sec ) = explode ( " ", microtime () );
   return (( float ) $usec + ( float ) $sec);
   }

   $temp="test";
   $result="";
   define("num",100000);
   $start=get_tm();

   for($i=0;$i<num;$i++)
   {
     $result=$result.$temp;
   }
   echo get_tm()-$start;

?>

11111\n

BufferedOutputStream 需求小心的事项:
  1. 利用BufferedOutputStream的write方法时候,数据实际上是写入了BufferedOutputStream内部维护的字节数组中,唯有你调用BufferedOutputStream的close方法仍然是flush方法数据才会真正的写到硬盘上去可能其中维护的字节数组已经储存满数据了,这时候数据也会写到硬盘上去。

  2. BufferedOutputStream
    的close方法其实关闭的就是你传入的OutputStream对象的close方法。

public class Demo2 {

    public static void main(String[] args) throws IOException {

        //找到目标文件对象
        File file = new File("f:\\a.txt");
        //建立数据的输出通道
        FileOutputStream fileOutputStream = new FileOutputStream(file);
        //建立缓冲输出字节流
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
        //写数据
        String data = "hello world";
        bufferedOutputStream.write(data.getBytes());

//      bufferedOutputStream.flush(); //把缓冲字节数组的数据写到硬盘上去。(立即)
        bufferedOutputStream.close();//(关闭流时)

    }
}

运行4次,除去第五次运行时刻,一遍时间分别为:

22222\n

22.165272951126
22.003527164459
22.15947508812

33333\n

其次种办法代码如下:

44444\n

<?php     
   function get_tm() {
   list ( $usec, $sec ) = explode ( " ", microtime () );
   return (( float ) $usec + ( float ) $sec);
   }

   $temp="test";
   $result="";
   define("num",100000);
   $start=get_tm();

   for($i=0;$i<num;$i++)
   {
     $result.=$temp;
   }
   echo get_tm()-$start;

?>

55555\n

运行4次,除去第三遍运行时刻,一遍时间独家为:

…..\n

3.1967310905457
3.1296961307526
3.0872850418091

nnnnnnnnnnn\n

其两种格局代码如下:

一旦用file($file)读入的话.耗时十分短.

<?php      
   function get_tm() {
   list ( $usec, $sec ) = explode ( " ", microtime () );
   return (( float ) $usec + ( float ) $sec);
   }

   $temp="test";
   $result="";
   $arr=array();
   define("num",100000);
   $start=get_tm();

   for($i=0;$i<num;$i++)
   {
     array_push($arr, $temp);
   }
   $result=join($arr);
   echo get_tm()-$start;

?>

可以用如下方法explode(“\n”,file_get_contents($file));作用会快很多.

运作4次,除去第四遍运行时刻,三遍时间分别为:

第二条,数组的遍历方式.

3.3184430599213
3.2759411334991
3.2663381099701

多少已经被读入数组了.上面就是遍历了.

由上可知,直接通过.进行字符串的两次三番功用最为低下。

本身所急需的是确定数组中有无一个值的存在,比如说44444是或不是在数组中.首先想到的是in_array()

以上那篇有关php两种字符串连接的频率相比较(详解)就是作者分享给我们的全体内容了,希望能给我们一个参阅,也希望大家多多援助脚本之家。

可是实验了下发现效能很低下.于是参考旁人的代码想到一个办法.把数组翻转过来.变成具有值都为1.原先的值变成了索引.那么一旦本身在if里写($arr[索引]==1)去判断.果然成效高出很多.

您大概感兴趣的篇章:

  • php
    include加载文件三种方法作用比较
  • php中读写文件与读写数据库的频率相比较分享
  • PHP
    字符串长度判断功能更高的措施
  • PHP的单引号和双引号
    字符串效用
  • PHP遍历数组的两种格局及功能相比分析
  • php程序功能优化的有的方针小结
  • PHP中3种生成XML文件格局的进程功能相比较
  • PHP静态延迟绑定和普通静态功效的比较

在数组的遍历进程中.要是数组个头卓殊大,并且数组中的数据并不是万能用到的话,最好把用来遍历的数组抽出来.那样会增高广大功效.

其三条,数组的存储.

把计算过后的数额保存起来.存在一个文书中.考虑了三种方法.一种是一向写成php文件.一种是serialize,一种是json串.

先是种格局

直白写入文件<?php 连接var_export($var)连接”;”连接?>保存成PHP

急需的时候直接require进来.

其次种办法.把变量serialize然后file_put_contents()进入文件.使用的时候unserialize就ok.

其三种艺术和第二种类似.只可是写成了json串.

透过测试.发现第二种效能最高.第二种其次.和第二种效用齐足并驱.第一种最慢.和自身料想的差距很大.真是大跌眼镜.

你或许感兴趣的篇章:

  • php对csv文件的读取,写入,输出下载操作详解
  • php从文件夹随机读取文件的方法
  • php读取csc文件并出口
  • PHP文件读取功用的施用实例
  • php读取文件内容到数组的不二法门
  • php断点续传之怎么着划分合并文件
  • php已毕读取和写入tab分割的文件

相关文章

发表评论

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

*
*
Website