栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

PHPExcel用尽了256、512和1024MB的RAM

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

PHPExcel用尽了256、512和1024MB的RAM

在PHPExcel论坛上已经有很多关于PHPExcel的内存使用的文章。因此通读之前的一些讨论可能会给您一些想法。PHPExcel保留电子表格的“内存中”表示形式,并且容易受到PHP内存限制的影响。

该文件的物理大小在很大程度上无关紧要……了解该文件包含多少个单元格(每个工作表上的行*列)更为重要。

我一直使用的“经验法则”平均约为每单元1k,因此5M单元工作簿将需要5GB内存。但是,可以通过多种方法来减少该需求。可以将它们组合在一起,具体取决于您需要在工作簿中访问哪些信息以及您要如何处理。

如果您有多个工作表,但是不需要全部加载,则可以使用setLoadSheetsOnly()方法来限制Reader将加载的工作表。加载单个命名工作表:

$inputFileType = 'Excel5'; $inputFileName = './sampleData/example1.xls';$sheetname = 'Data Sheet #2'; $objReader = PHPExcel_IOFactory::createReader($inputFileType); $objReader->setLoadSheetsonly($sheetname); $objPHPExcel = $objReader->load($inputFileName);

或者,您可以通过传递名称数组来一次调用setLoadSheetsOnly()来指定多个工作表:

$inputFileType = 'Excel5'; $inputFileName = './sampleData/example1.xls';$sheetnames = array('Data Sheet #1','Data Sheet #3');  $objReader = PHPExcel_IOFactory::createReader($inputFileType); $objReader->setLoadSheetsonly($sheetnames); $objPHPExcel = $objReader->load($inputFileName);

如果您只需要访问工作表的一部分,则可以定义一个“读取过滤器”来识别您实际要加载的单元格:

$inputFileType = 'Excel5'; $inputFileName = './sampleData/example1.xls';$sheetname = 'Data Sheet #3'; class MyReadFilter implements PHPExcel_Reader_IReadFilter {    public function readCell($column, $row, $worksheetName = '') {        //  Read rows 1 to 7 and columns A to E only         if ($row >= 1 && $row <= 7) {if (in_array($column,range('A','E'))) {    return true;}        }         return false;    }} $filterSubset = new MyReadFilter();  $objReader = PHPExcel_IOFactory::createReader($inputFileType); $objReader->setLoadSheetsonly($sheetname); echo 'Loading Sheet using filter'; $objReader->setReadFilter($filterSubset); $objPHPExcel = $objReader->load($inputFileName);

使用读取过滤器,您还可以“大块”地读取工作簿,以便在任何时候仅一个块驻留在内存中:

$inputFileType = 'Excel5'; $inputFileName = './sampleData/example2.xls'; class chunkReadFilter implements PHPExcel_Reader_IReadFilter {    private $_startRow = 0;    private $_endRow = 0;         public function setRows($startRow, $chunkSize) {         $this->_startRow    = $startRow;         $this->_endRow      = $startRow + $chunkSize;    }    public function readCell($column, $row, $worksheetName = '') {        //  only read the heading row, and the rows that are configured in $this->_startRow and $this->_endRow         if (($row == 1) || ($row >= $this->_startRow && $row < $this->_endRow)) { return true;        }        return false;    } }$objReader = PHPExcel_IOFactory::createReader($inputFileType); $chunkSize = 20; $chunkFilter = new chunkReadFilter();  $objReader->setReadFilter($chunkFilter); for ($startRow = 2; $startRow <= 65536; $startRow += $chunkSize) {          $chunkFilter->setRows($startRow,$chunkSize);          $objPHPExcel = $objReader->load($inputFileName);     //    Do some processing here    //    Free up some of the memory     $objPHPExcel->disconnectWorksheets();     unset($objPHPExcel); }

如果您不需要加载格式信息,而仅加载工作表数据,则setReadDataOnly()方法将告诉读者仅加载单元格值,而忽略任何单元格格式:

$inputFileType = 'Excel5';$inputFileName = './sampleData/example1.xls'; $objReader = PHPExcel_IOFactory::createReader($inputFileType); $objReader->setReadDataonly(true);$objPHPExcel = $objReader->load($inputFileName);

使用单元缓存。这是一种减少每个单元所需的PHP内存的方法,但是会降低速度。它通过以压缩格式存储单元对象或在PHP内存(例如磁盘,APC,内存缓存)之外存储单元对象而工作…但是,保存的内存越多,脚本执行的速度就越慢。但是,您可以将每个单元所需的内存减少到大约300bytes,因此假设的5M单元将需要大约1.4GB的PHP内存。

单元缓存在开发人员文档的4.2.1节中进行了描述



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/416962.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号