phpexcel 内存溢出 优化
最近我们公司的项目的在导出excel的时候偶尔出现内存溢出错误,经过测试发现当数据量大于5000条就出现这个问题(默认php.ini memory 是128M)
Allowed memory size of 134217728 bytes exhausted (tried to allocate 43 bytes)
解决内存溢出问题方法如下
增加内存了,修改php.ini中memory_limit 或者 @ini_set('memory_limit','256M')
PHPEXCEL库支持使用缓存 具体缓存使用请查看 phpExcel大数据量情况下内存溢出解决
找出内存急剧增加的原因
方案1 和 方案2 算是非常简单粗暴的了,但是没有触及根本,就是为什么会内存溢出,作为技术人咱们就应该打破砂锅问到底了
本文主要简单描述下我是如何排查内存溢出问题并如何修复的
操作步骤
业务大致逻辑
① 查询数据库取出所有符合条件的数据
② 循环符合条件的数据,进行数据处理,并放入一个新数组中
③ 使用PHPEXCEL库生成excel表格
Debug
借助php的memory_get_usage函数查看内存使用情况
断点1:8M
业务逻辑①
断点2:47M
业务逻辑②
断点3:82M
业务逻辑③
断点4:140M
从上图我们可以得出如下结论
业务逻辑① 消耗内存:39M = 47M - 8M
业务逻辑② 消耗内存:35M = 82M - 47M
业务逻辑③ 消耗内存:58M = 140M - 82M
优化业务逻辑③
从业务逻辑描述看,业务逻辑①是优化不掉的,查询数据库系统必然开销了。我一开始想到的是优化业务逻辑③
业务逻辑③:主要是调用第三方库PHPEXCEL生成表格,通过google了下发现主要都是通过缓存解决这个问题,PHPEXCEL作者本身就考虑到了这个问题,大家可以查询这边文章 phpExcel大数据量情况下内存溢出解决
断点1:8M
业务逻辑①
断点2:47M
业务逻辑②
断点3:82M
业务逻辑③
断点4:117M
这样之后,内存使用情况
业务逻辑① 消耗内存:39M = 47M - 8M
业务逻辑② 消耗内存:35M = 82M - 47M
业务逻辑③ 消耗内存:35M = 117M - 82M
优化业务逻辑②
业务逻辑②只是简单的遍历进行数据处理,并放入到新的数组中去。这也就明白了,大数组引起的内存开销,也是没办法避免的。但是我中午在考虑着问题的时候发现了一点,对于没用的变量我们要及时注销(unset),这样我就发现业务逻辑① 结果集变量经过遍历之后就没有用啦,可以直接注销掉,这样优化之后 内存使用情况如下
断点1:8M
业务逻辑①
断点2:47M
业务逻辑②
断点3:31M
业务逻辑③
断点4:67M
这样之后,内存使用情况
业务逻辑① 消耗内存:39M = 47M - 8M
业务逻辑② 消耗内存:-16M = 31M - 47M
业务逻辑③ 消耗内存:36M = 67M - 31M
成果
经过优化 最后只是用67M内存,就算是默认的128M限制 我们都可以很好的支持了 ~~,最后其实我们使用了三种方案的结合体
Game Over
经过仔细排除优化,其实发现做这类刨根问底的事情也是蛮有成就感的,并且也算是真真在慢慢深入底层了,关于php的引用计数 和 写时复制希望大家都可以了解下
参考资料
phpExcel大数据量情况下内存溢出解决: http://www.cnblogs.com/myx/archive/2013/05/20/phpExcel-setCache.html
PHP扩展开发及内核应用:http://www.cunmou.com/phpbook/
原文地址:phpexcel 内存溢出 优化
标签:phpexcel php exhausted memory 内存溢出
智能推荐
phpexcel 内存溢出 优化的更多相关文章
- Java内存溢出优化性能优化
高性能应用构成了现代网络的支柱.LinkedIn有许多内部高吞吐量服务来满足每秒数千次的用户请求.要优化用户体验,低延迟地响应这些请求非常重要. 比如说,用户经常用到的一个功能是了解动态信息——不断更 ...
- Java常见问题分析(内存溢出、内存泄露、线程阻塞等)
Java垃圾回收机制(GC) 1.1 GC机制作用 1.2 堆内存3代分布(年轻代.老年代.持久代) 1.3 GC分类 1.4 GC过程 Java应用内存问题分析 2.1 Java内存划分 2.2 J ...
- phpExcel导出文件时内存溢出的问题
在使用PHPExcel导出文件时,经常会因为文件过大导致PHP内存溢出报错,为了解决这个问题,可以使用PHPExcel提供的参数进行优化.这里说的Excel文件过大并不一定是文件大小,更关键的在于文件 ...
- hive中与hbase外部表join时内存溢出(hive处理mapjoin的优化器机制)
与hbase外部表(wizad_mdm_main)进行join出现问题: CREATE TABLE wizad_mdm_dev_lmj_edition_result as select * from ...
- [Android] 对自定义图片浏览器经常内存溢出的一些优化
首先关于异步加载图片可以参见 夏安明 的博客:http://blog.csdn.net/xiaanming/article/details/9825113 这篇文章最近有了新的更改,大概看了一下,内容 ...
- 从内存泄露、内存溢出和堆外内存,JVM优化参数配置参数
内存泄漏 内存泄漏是指程序在申请内存后,无法释放已申请的内存空间,无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费.内存泄漏最终会导致OOM. 造成内存泄漏 ...
- jvm内存溢出分析
概述 jvm中除了程序计数器,其他的区域都有可能会发生内存溢出 内存溢出是什么? 当程序需要申请内存的时候,由于没有足够的内存,此时就会抛出OutOfMemoryError,这就是内存溢出 内存溢出和 ...
- Tomcat中JVM内存溢出及合理配置及maxThreads如何配置(转)
来源:http://www.tot.name/html/20150530/20150530102930.htm Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个Java虚 ...
- Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结
最近老是遇见服务器内存溢出的问题,故在网上搜了搜,总结了一些java内存溢出的解决方式 java.lang.OutOfMemoryError这个错误我相信大部分开发人员都有遇到过,产生该错误的原因大都 ...
随机推荐
- JavaScript无缝滚动
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- linux 安装eclipse 和cdt
这个东西说起来简单,但是经历了无数次到失败,终于还是安装完成了. 最早到时候我下载了eclipse和cdt让后安装,安装完成以后,无法运行和编译程序 后来我学到了一个牛逼的命令yum 这个命令会帮助我 ...
- BZOJ4635 : 数论小测验
第一问: 设$a[i]$表示使用$[1,i]$的数字$n$次形成的数组里有多少个$\gcd=1$. 考虑容斥,则$a[i]=i^n-\sum_{j=2}^i a[\lfloor\frac{i}{j}\ ...
- JDBC 对数据库连接的封装
1.BaseDao :抽象基类,其中定义了用于打开连接,得到Statement,执行SQL,关闭资源的基础数据库操作方法. 2.I***Dao :操作指定数据表的接口:定义了操作数据表的抽象方法. 3 ...
- ACM 众数问题
众数问题 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 所谓众数,就是对于给定的含有N个元素的多重集合,每个元素在S中出现次数最多的成为该元素的重数, 多重集合S重 ...
- NOIp 2012 #2 借教室 Label:区间修改线段树
题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自然 ...
- HDU-统计难题
DescriptionIgnatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀). Inp ...
- tornado 学习笔记3 安装
3 安装 安装分为两种方式:自动安装和手动安装,推荐采用自动安装,提前是机器联网的情况下. 3.1 自动安装: 命令:pip install tornado 写一段代码测试一下安装是否成功 # -*- ...
- 淘宝UED上关于chrome的transition闪烁问题的解决方案
前段时间,有同事和会员反馈使用Chrome访问淘宝首页会出现画面闪动的现象,但是我在Mac和Win下面的Chrome都无法重现这个问题,后来重装了一遍Win7下的Chrome Beta版本,终于重现了 ...
- BZOJ3992: [SDOI2015]序列统计
Description 小C有一个集合S,里面的元素都是小于M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数列中的每个数都属于集合S. 小C用这个生成器生成了许多这样的数列. ...