PHPExcel大文件块级别读取 速度快 减少占用资源

  /**
     * 读取excel转换成数组
     *
     * @param string $excelFile 文件路径
     * @param int $startRow 开始读取的行数
     * @param int $endRow 结束读取的行数
     * @return array
     */
    private function readFromExcel($excelFile, $startRow = 1, $endRow = 100) {
        include_once ‘./Core/Common/PHPExcel.php‘;
        include_once ‘./Core/Common/PHPExcelReadFilter.php‘;

        $excelType = PHPExcel_IOFactory::identify($excelFile);
        $excelReader = \PHPExcel_IOFactory::createReader($excelType);

        if(strtoupper($excelType) == ‘CSV‘) {
            $excelReader->setInputEncoding(‘GBK‘);
        }

        if ($startRow && $endRow) {
            $excelFilter           = new PHPExcelReadFilter();
            $excelFilter->startRow = $startRow;
            $excelFilter->endRow   = $endRow;
            $excelReader->setReadFilter($excelFilter);
        }

        $phpexcel    = $excelReader->load($excelFile);
        $activeSheet = $phpexcel->getActiveSheet();

        $highestColumn      = $activeSheet->getHighestColumn(); //最后列数所对应的字母,例如第1行就是A
        $highestColumnIndex = \PHPExcel_Cell::columnIndexFromString($highestColumn); //总列数

        $data = array();
        for ($row = $startRow; $row <= $endRow; $row++) {
            for ($col = 0; $col < $highestColumnIndex; $col++) {
                $data[$row][] = (string) $activeSheet->getCellByColumnAndRow($col, $row)->getValue();
            }
            if(implode($data[$row], ‘‘) == ‘‘) {
                unset($data[$row]);
            }
        }
        return $data;
    }
$rowSize = 200;
$startRow = 2;//从第二行开始读取
$endRow = $rowSize;
$excel_orders = array();
while (true) {
  $excel_orders = $this->readFromExcel(dirname(dirname(HOME_PATH)).‘/Upload/‘.$newname, $startRow, $endRow);
    if(empty($excel_orders)) {
          break;
    }
    $startRow = $endRow + 1;
    $endRow = $endRow + $rowSize;
}
/**
 * 读取excel过滤器类 单独文件
 */
class PHPExcelReadFilter implements PHPExcel_Reader_IReadFilter {

    public $startRow = 1;
    public $endRow;

    public function readCell($column, $row, $worksheetName = ‘‘) {
        if (!$this->endRow) {
            return true;
        }

        if ($row >= $this->startRow && $row <= $this->endRow) {
            return true;
        }

        return false;
    }

}

描述:用户导入订单数据,但用户导入8k左右的数据之后,PHP开始爆红了。

查阅部分资料得知,是由于PHPExcel的类读取,如果使用

$PHPExcel = $PHPReader->load($newfilename);

load的方式读取文件的话,是把文件中的全部内容读出并储存在内存中,再读取内容的话,就是直接从内存中读取,极其消耗资源。

而以上代码片段实现的效果就是我需要那块(n-m行)的内容,我只读去那部分的内容,不会加载整个文件。

最后,使用完变量,可以进行 $a = null; / unset($a); 进行释放资源。

祝工作顺利!

时间: 2024-10-10 10:30:29

PHPExcel大文件块级别读取 速度快 减少占用资源的相关文章

python对大文件的增量读取

欢迎关注我的豆瓣http://www.douban.com/note/484517776/ 对于很多大文件的增量读取,如果遍历每一行比对历史记录的输钱或者全都加载到内存通过历史记录的索引查找,是非常浪费资源的,网上有很多人的技术博客都是写的用for循环readline以及一个计数器去增量读取,这样是十分脑残的,假如文件很大,遍历一次太久.  我们需要了解获取文件句柄的基本理论,其中包含的指针操作等.  原理是这样子,linux的文件描述符的struct里有一个f_pos的这么个属性,里面存着文件

C# 读取大文件 (可以读取3GB大小的txt文件)

在处理大数据时,有可能 会碰到 超过3GB大小的文件,如果通过 记事本 或 NotePad++去打开它,会报错,读不到任何文件. 如果你只是希望读取这文件中的前几行,怎么办,下面的工具会帮您解决这个问题. 而且读取时间很快. 工具下载地址: http://pan.baidu.com/s/1y34wt      (15KB左右, 备注:要运行这个工具,需要您的机器已装过 .netFramework4.0 ) 源代码下载地址:http://pan.baidu.com/s/1jAyjl       

Linux删除大文件进程还在导致磁盘空间占用100%问题处理

1. 问题描述 上午收到鹰网监控,某台应用机器的磁盘利用率达到100%,通过df和du等命令查看占用的磁盘空间并没有达到分配的逻辑卷挂载路径的最大值 2. 问题分析 最近公司那边开发了代码发布平台,在进行代码更新时,先删除日志缓存文件,在进行进程停止导致的 3. 问题处理 使用lsof |grep deleted命令查看已经标记为已经删除的文件 注:这个deleted表示该已经删除了的文件,但是文件句柄未释放,这个命令会把所有的未释放文件句柄的进程列出来 使用kill命令进行杀进程操作,但是该操

ASP.NET Core下载大文件的实现

当我们的ASP.NET Core网站需要支持下载大文件时,如果不做控制可能会导致用户在访问下载页面时发生无响应,使得浏览器崩溃.可以参考如下代码来避免这个问题. 关于此代码的几点说明: 将数据分成较小的部分,然后将其移动到响应输出流以供下载,从而获取这些数据. 根据下载的文件类型来指定 Response.ContentType .(这个网址可以找到大部分文件类型的对照表:http://tool.oschina.net/commons) 在每次调用Response.Body.Write后记得调用

修改phpmyadmin不能导入大文件的限制

情景:我需要导入一张1.03GB的数据表,但是phpmyadmin导入文件默认为不能超过2M.因此需要修改phpmyadmin导入文件的大小限制. 1.phpmyadmin的导入也就是php完成文件上传的过程,因此先修改配置文件php.ini的上传相关参数: 1.1修改上传文件大小 upload_max_filesize   最大上传文件大小参数,默认为2M.修改成1500M,即upload_max_filesize = 1500M post_max_size     允许POST的数据最大字节

读取大文件时的优化经验

最近在编写一个关于图形学的东西时,由于需要读取模型,写了一个obj文件和mtl文件解析器.实际调试时,由于该文件较长,比如obj文件达到了20万行的量级,在解析时凸显出了各种性能问题,解决这些性能问题的同时,也总结出了一些经验,记录如下: 1 必须使用缓冲区.虽然操作系统实现读取文件应该是有缓冲区概念的,但是结果显示如果不使用缓冲区,而用fgetc挨个字符进行读取,速度会比使用缓冲区慢上1个数量级.因此,引出第一条经验:一切大文件读取必须使用缓冲区,减少fread或fgetc的次数. 2 关于m

iOS将大文件映射到内存(读取大文件)

http://blog.csdn.net/xyt243135803/article/details/40995759 在<中国区GPS偏移纠正(适用于Google地图)>一文中曾读取一个78M的大数据文件,一开始采用了NSData的dataWithContentsOfFile:方法.不少人反馈说如果直接使用,将会耗尽iOS的内存.其实这个是可以改善的. NSData还有一个API: + (id)dataWithContentsOfFile:(NSString *)path options:(N

多线程读取大文件,尤其是对日志文件分析很有用。

我在之前的公司里工作的时候,他们要求我做一个能够分析IIS日志的程序,可我做来做去,也只能做到,1个G的文件读取在140秒左右.愁了很久,想到了用多线程读取大文件的方法,又发现文件读取流可以有很多个,于是我就开始编写,写出来,其效率 4核CPU,可以达到14秒,提高了10倍. 而且据我测试发现,我4个CPU,用8个线程读取效率最高,所以我想会不会是一个CPU挂2个文件流效率最高,故基本逻辑是这样的,我根据CPU核数,将文件分成8块,分成8块的时候,必定出现,一行被截断的情况,针对这种情况,我采用

PHP 大文件的读取和写入问题

在通常的学习和开发中,因为我们很少会接触到大量数据的读取和写入,所以当突然有了这种需求的时候,我们可 能仍然会按照一些比较快捷的方法,像file_get_contents,fread等方法来读取文件,不过这样以来如果读取的文件太 大,就会产生问题,在实现大文件读取和写入的时候查找了网上的一些资料,不过有些例子给的不是很符合我的需 求,所以我就结合网上已有的例子,再写一篇总结性的博客吧. 那么究竟会产生什么问题呢,这就要说一些PHP的底层实现数,file_get_contents和fread来说一