php self 内存,php导致内存溢出
在执行一个导出csv脚步时,当要导出的数据超过3w多条时,就会报错,如下:
Allowed memory size of 134217728 bytes exhausted (tried to allocate 20480 bytes)
php存储3w多条数据这个数组占用内存超过20M
解决方法:分批取数据,分批处理数据
问题点:一次取多少数据最合适
一次取1w条,减少数据库IO操作次数,但php数组就好较大
一次取1k条,增加了数据库IO操作次数,php数组很小
数据一共41000条
因为是循环查询数据,只能返回空,所以会有一次无效的IO查询
每次请求次数
响应时间
数组库IO次数
5000
11.34
10
1000
8.02
6
2000
7.07
4
3000
5.12
3
4000
4.93
3
综合考虑,觉得使用每次请求1w条数据
代码简单记录下
$filename = '测试';
$head = array('申请时间', '省', '市', '超市品牌');
$field = array('created_time', 'pro_name', 'city_name', 'brand_name');
$csv = ExportCsvService::getInstance(implode(",", $head), $field, $filename);
$param['limit'] = C('SQL_LIMIT');
$i = 0;
while (true) {
$param['current'] = $i + 1;
$info = $rainbowservice->get_list($param)['data']['list'];
if (empty($info)) {
$csv->end();
break;
} else {
$csv->sendDate($info);
}
unset($info);
$i++;
}
csv操作类
class ExportCsvService
{
private $content;
private $filename;
private $field;
private static $instance;
private function __construct($head,$field,$filename)
{
$this->field = $field;
$this->filename = $filename;
$this->content = iconv('UTF-8', 'GBK',$head) . PHP_EOL;
}
/**
* 实例化服务类
* @param $head
* @param $field
* @param $filename
* @return ExportCsvService
*/
public static function getInstance($head,$field,$filename) {
if (!self::$instance instanceof self) {
self::$instance = new self($head,$field,$filename);
}
return self::$instance;
}
/**
* 拼接要导出的数据
* @param $data
*/
public function sendDate($data) {
foreach ($data as $key => $value) {
$temp = [];
foreach ($this->field as $k) {
$temp[] = iconv('UTF-8', 'GBK', $value[$k]);
}
$this->content .= implode(",", $temp) . PHP_EOL; //用英文逗号分开
unset($temp);
}
}
/**
* 输出数据
*/
public function end() {
header("Content-type:text/csv;charset=GBK");
header("Content-Disposition:attachment;filename=" . $this->filename);
header('Cache-Control:must-revalidate,post-check=0,pre-check=0');
header('Expires:0');
header('Pragma:public');
echo $this->content;
}
}
php self 内存,php导致内存溢出相关推荐
- [转]避免PHP-FPM内存泄漏导致内存耗尽
对于PHP-FPM多进程的模式,想要避免内存泄漏问题很简单,就是要让PHP-CGI在处理一定数量进程后退出即可. 否则PHP程序或第三方模块(如Imagemagick扩展)导致的内存泄漏问题会导致内存 ...
- 动态内存分配导致内存泄漏之处
摘要:举了几个动态内存分配过程中,发生内存泄漏的例子 1. 分配了内存,却没有及时删除,导致泄漏 1: void doSomething() 2: { 3: int *pnValue = new in ...
- 排查软件关闭时访问了0xfeeefeee内存地址导致内存访问违例的崩溃
最近在使用duilib开源库实现图片查看工具软件ImageViewer,调试时发现,程序关闭时访问了0xfeeefeee内存地址,触发内存访问违例,导致了软件崩溃.本文分享一下这一问题的排查过程. 1 ...
- Windows 10 高占用内存率导致内存不够,从而系统崩溃的配置处理方法
现有三种方法,按照顺序使用: 方法一: 点击"开始"按钮-->Win键+R-->输入regedit-->确定-->HKLM-->System--> ...
- 排查软件启动时访问了0xcdcdcdcd内存地址导致内存访问违例的崩溃
VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排查从 ...
- 《深入理解Java虚拟机》之Java内存区域与内存溢出异常
阅读<深入理解Java虚拟机>第2版,结合JDK8的读书笔记.当前文章为书本的第2章节. 2.1.概述 从概念上介绍Java虚拟机内存的各个区域,讲解这些区域的作用,服务对象以及其中可能产 ...
- java内存泄露和内存溢出
内存泄露 是指:对象没有被用到,但是又无法被GC回收就是内存泄露: 分类:经常发生: 发生内存泄露的代码会被多次执行,每次执行,泄露一块内存偶然发生: 在某些特定情况下才会发生一次性: 发生内存泄露的 ...
- s5 android5.0内存泄漏,android-最初从位图泄漏了未引用的byte [],但被回收的()导致内存泄漏(直到活动停止)...
我的位图内存泄漏导致内存不足.我在Android 5.0(Samsung S5)上运行了测试.我已经使用Android Studio(1.5.1 2.0.0预览版7)调查了此问题. HPROF内存转储 ...
- 硬核分析|腾讯云原生OS内存回收导致关键业务抖动问题
实战系列: 精选各种常见的代表性实际问题,分享一步一步思考和解决方法,梳理整个问题脉络,可以学习到解决问题各种技巧和通用技能,锻炼解决问题思维能力,让大家成为解决问题的高手: 往期文章推荐: 一个刁钻 ...
最新文章
- 我自己写的3D图形数学库。。。有点乱!
- 第三十一篇:SOUI布局之相对于特定兄弟窗口
- 30-35岁职场规划深谈,字字戳心
- 坚果云下载的文件夹在哪_坚果云文件夹在哪?如何直接访问坚果云文件夹?
- 【机器视觉】 gen_measure_arc算子
- DNS子域授权及view(三)
- 力扣(LeetCode)292. Nim游戏 巴什博奕
- Java保留小数点一位的方法
- 非法操作 login.php,阅文游戏中心 h5游戏接入wiki
- 内存释放_把微信这两个开关关掉, 手机立马释放大量内存, 快去试试吧
- react-native 学习
- 最新版O泡易支付系统平台 PHP源码 第三方第四方免签支付平台系统 全开源可二开
- NPDP产品经理小知识-影响团队绩效的因素
- 湖北为何迷失在中国互联网版图 应“引凤归巢”
- java日志(四)--jcl和log4j及log4j2使用
- 电脑横机服务器维修,电脑横机常见问题的处理方法
- Sublime修改成为Python编辑器,设置系统环境变量
- 逆幂律模型_为“成功”建模:幂律分布
- 嵌入式开发-各种干货
- Python搞不定蝴蝶图?
热门文章
- 在配置类上写@CompentScan注解来进行包扫描
- JDK API实践:Spring怎样取舍Java I-O、集合、反射、动态代理等API的使用
- plsql(轻量版)_基本语法
- Dubbo的Provider配置
- php 在对象中递归 坑,PHP递归问题,数据总是对不上
- 微星z370黑苹果_记录一下装了第二台黑苹果(Z370 + High Sierra)
- mysql insert 语句优化_分享insert into语句优化的小技巧
- log4j2.xml 的标签 loggers 中 root 的属性 level 指的是什么
- (转) 对svn分支合并类型和深度的理解
- 图像像素灰度内插(Matlab实现)