PHP读取大文件的几种方法介绍
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP读取大文件的几种方法介绍相关的知识,希望对你有一定的参考价值。
参考技术A 1. 直接采用file函数来操作由于 file函数是一次性将所有内容读入内存,而php为了防止一些写的比较糟糕的程序占用太多的内存而导致系统内存不足,使服务器出现宕机,所以默认情况下限制只能最大使用内存16M,这是通过php.ini里的 memory_limit = 16M 来进行设置,这个值如果设置-1,则内存使用量不受限制。
2.直接调用Linux的 tail 命令来显示最 后几行
在Linux命令行下,可以直接使用 tail -n 10 access.log 很轻易的显示日志文件最后几行,可以直接用PHP来调用tail命令.
3. 直接使用PHP的 fseek 来进行文件操作
这种方式是最为普遍的方式,它不需要将文件的内容全部读入内容,而是直接通过指针来操作,所以效率是相当高效的。在使用fseek来对文件进行操作时,也有多种不同的方法,效率可能也是略有差别的.本回答被提问者和网友采纳
快速读取大文件的几种方式
转一篇:http://blog.csdn.net/fengxingzhe001/article/details/67640083
原来使用一行一行读取文本的方式,速度是慢的的可以,弄了好久还是不行,后来看了下才知道要用字节流传输会快很多
我自己也测了一下80M的文件,发现给读入块的大小会很明显的影响读入的速度。
测试代码如下:
def useBufferIStream(): Util = {
try {
val begin = System.currentTimeMillis
val file = new File(s"E:\\data\\part-m-00000")
val fis = new FileInputStream(file)
val bis = new BufferedInputStream(fis)
val buffer = new Array[Byte](1024*1024*90)
var content = ""
var cnt = 0
cnt = bis.read(buffer)
while( cnt != -1) {
content += new String(buffer, 0, cnt)
cnt=bis.read(buffer)
}
bis.close()
println("=====BufferIStream===== time: " + (System.currentTimeMillis - begin) + "ms")
} catch {
case e: Exception =>
// TODO Auto-generated catch block
e.printStackTrace()
println("error")
}
}
代码中绿色部分为读入块的大小,目前设定的是90M大于要读的数据,这时的读入时间只要0.2s
如果改为10M即(1024*1024*10),读入时间就需要10s左右,速度有很明显的变化。
这里解释一下一部分代码:
1、val buffer = new Array[Byte](1024*1024*90) 为每次读入文件的大小;
2、cnt = bis.read(buffer) 读入数据块大小的标识,如果读入块没用信息则为-1,有信息则为这块信息的大小;
3、content 为最终读入的文本信息
4、这里使用的Scala语言,测试中发现
cnt = bis.read(buffer) while( cnt != -1) { content += new String(buffer, 0, cnt) cnt=bis.read(buffer) }
while的这块语句书写必须用这种形式,不能使用 while((cnt=fis.read(buffer)) != -1) ,虽然在java上运行是都可以的,但是在Scala中,后者运行会报错,具体原因不明,应该跟Scala的一些机制有关
以上是关于PHP读取大文件的几种方法介绍的主要内容,如果未能解决你的问题,请参考以下文章