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这个错误我相信大部分开发人员都有遇到过,产生该错误的原因大都 ...
随机推荐
- Codeforces Round #343 (Div. 2)
居然补完了 组合 A - Far Relative’s Birthday Cake import java.util.*; import java.io.*; public class Main { ...
- Air Raid[HDU1151]
Air RaidTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- js 的try catch应用
<script language="javascript"> try { throw new Error(10,"asdasdasd") } cat ...
- POJ 3061 (二分+前缀和or尺取法)
题目链接: http://poj.org/problem?id=3061 题目大意:找到最短的序列长度,使得序列元素和大于S. 解题思路: 两种思路. 一种是二分+前缀和.复杂度O(nlogn).有点 ...
- Posterior visual bounds retrieval for the Plato framework
Plato is a MVVM compliant 2D on-canvas graphics framework I've been designing and implementing for d ...
- 【转载】LoadRunner11下载以及详细破解说明
前期准备:LoadRunner11 下载请猛戳这里 传送门LoadRunner破解文件 下载请猛戳这里 传送门LoadRunner注册表清理工具 下载请猛戳这里 传送门 LoadRunner11破解方 ...
- 《深入浅出Windows 10通用应用开发》
<深入浅出Windows 10通用应用开发>采用Windows 10的SDK进行重新改版,整合了<深入浅出Windows Phone 8.1应用开发>和<深入解析 ...
- Oracle常用监控SQL
1.监控事例的等待: select event,sum(decode(wait_time,0,0,1)) prev, sum(decode(wait_time,0,1,0)) curr,count(* ...
- 为什么C#不使用多继承?(from stackoverflow)
简单地说:是因为该语言的设计者决定不使用. 基本上,.NET和Java的设计者不使用多继承(MI),是因为他们认为给语言加上多继承获得的好处较少,抵不上因此增加的复杂性. 1.不同的语言对于多继承如何 ...
- 为什么用evernote
其实是没有什么为什么的. 如果真要找个理由,那应该是: 为知的界面看着总觉得很糙. 这个糙指的是不像个好软件,而装上evernote感觉就不一样. 有道笔记新版本貌似在我这儿有BUG. ...