最近我们公司的项目的在导出excel的时候偶尔出现内存溢出错误,经过测试发现当数据量大于5000条就出现这个问题(默认php.ini memory 是128M)

Allowed memory size of 134217728 bytes exhausted (tried to allocate 43 bytes)

解决内存溢出问题方法如下

方案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 内存溢出 优化的更多相关文章

  1. Java内存溢出优化性能优化

    高性能应用构成了现代网络的支柱.LinkedIn有许多内部高吞吐量服务来满足每秒数千次的用户请求.要优化用户体验,低延迟地响应这些请求非常重要. 比如说,用户经常用到的一个功能是了解动态信息——不断更 ...

  2. Java常见问题分析(内存溢出、内存泄露、线程阻塞等)

    Java垃圾回收机制(GC) 1.1 GC机制作用 1.2 堆内存3代分布(年轻代.老年代.持久代) 1.3 GC分类 1.4 GC过程 Java应用内存问题分析 2.1 Java内存划分 2.2 J ...

  3. phpExcel导出文件时内存溢出的问题

    在使用PHPExcel导出文件时,经常会因为文件过大导致PHP内存溢出报错,为了解决这个问题,可以使用PHPExcel提供的参数进行优化.这里说的Excel文件过大并不一定是文件大小,更关键的在于文件 ...

  4. hive中与hbase外部表join时内存溢出(hive处理mapjoin的优化器机制)

    与hbase外部表(wizad_mdm_main)进行join出现问题: CREATE TABLE wizad_mdm_dev_lmj_edition_result as select *  from ...

  5. [Android] 对自定义图片浏览器经常内存溢出的一些优化

    首先关于异步加载图片可以参见 夏安明 的博客:http://blog.csdn.net/xiaanming/article/details/9825113 这篇文章最近有了新的更改,大概看了一下,内容 ...

  6. 从内存泄露、内存溢出和堆外内存,JVM优化参数配置参数

    内存泄漏 内存泄漏是指程序在申请内存后,无法释放已申请的内存空间,无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费.内存泄漏最终会导致OOM. 造成内存泄漏 ...

  7. jvm内存溢出分析

    概述 jvm中除了程序计数器,其他的区域都有可能会发生内存溢出 内存溢出是什么? 当程序需要申请内存的时候,由于没有足够的内存,此时就会抛出OutOfMemoryError,这就是内存溢出 内存溢出和 ...

  8. Tomcat中JVM内存溢出及合理配置及maxThreads如何配置(转)

    来源:http://www.tot.name/html/20150530/20150530102930.htm Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个Java虚 ...

  9. Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结

    最近老是遇见服务器内存溢出的问题,故在网上搜了搜,总结了一些java内存溢出的解决方式 java.lang.OutOfMemoryError这个错误我相信大部分开发人员都有遇到过,产生该错误的原因大都 ...

随机推荐

  1. 把文本框嵌入到form

    <form action="/submit-cat-photo"> <input type="text" placeholder=" ...

  2. POJ2135 Farm Tour(最小费用最大流)

    题目问的是从1到n再回到1边不重复走的最短路,本质是找1到n的两条路径不重复的尽量短的路. #include<cstdio> #include<cstring> #includ ...

  3. reshape2包--R高效数据处理包

    介绍如何使用reshape2包将宽型数据转换成长型数据,将长型数据转换成宽型数据.Reshape2是Hadley Wickham开发和维护的. 1.长数据VS宽数据 宽型数据:每列代表一个不同的变量. ...

  4. Tomcat在局域网中localhost可以访问,但是无法通过本地ip访问,127.0.0.1也无法访问问题的解决方法

    环境:Tomcat6,Windows Server2008 R2, Tomcat使用默认端口8080. 在BO服务器上使用Tomcat6作为WEB服务器,在服务器本地使用http://localhos ...

  5. (转)Array.prototype.slice.call自解

    很多框架或者库里面都会有这句的使用,最多的还是通过Array.prototype.slice.call(arguments,0)把arguments这个伪数组转换为真正的数组.但为什么可以这么做,却一 ...

  6. BZOJ 2038 小z的袜子 & 莫队算法(不就是个暴力么..)

    题意: 给一段序列,询问一个区间,求出区间中.....woc! 贴原题! 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过 ...

  7. CODEVS 1817 灾后重建 Label:Floyd || 最短瓶颈路

    描述 灾后重建(rebuild)  B地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响.但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车.换句话说,只有连接着两 ...

  8. 移动端开发——javascript

    javascript(简称js)语言在移动前端应用很广.可以说必不可少,许多效果都是和js相关的.包括现在移动端的一些框架.jqmobi.jqtouch.sencha touch.jquerymobi ...

  9. TC SRM 591 DIV2 1000

    很不错的一题,非常巧妙的用DP顺序解决这个问题... 可以发现,只和A里面最小的有关系... #include <cstdio> #include <cstring> #inc ...

  10. DropDownList 选中change

    <script language="javascript" type="text/javascript">$(function(){    $(&q ...