php大量数据 10M数据从查询到下载 【内存溢出,查询过慢】解决方案
功能描述:做数据导出
功能分析:1.采用csv的格式,因为csv的格式比excel小
2. 3W条数据,100个字段需要全部导出
开始
直接查询
//此处使用的laravel框架,具体含义一看就懂
tableModel::orderby("id","asc")->get()->toArray();


为什么会执行这么长时间?还没有返回结果
猜测出现的问题
1.查询时间过长,mysql断开连接。
2.php内存溢出。
测试
1.先测试mysql :在Navicat 数据库工具中执行查询

mysql 执行没有什么问题。
2. 测试php是否是内存过大
echo '开始内存:'.memory_get_usage(), '</br>';
$tmp=$car_model->take(1000)->get()->toArray();
echo '运行后内存:'.memory_get_usage(), '</br>';
unset($tmp);
echo '回到正常内存:'.memory_get_usage();

正常返回值了,再来2000条数据
$tmp=$car_model->take(2000)->get()->toArray();

接下来5000条
$tmp=$car_model->take(5000)->get()->toArray();

居然是原来内存的10倍,内存的占用根据条数成倍的增加,好强大。
接下来10000条数据
$tmp=$car_model->take(10000)->get()->toArray();
OH YEAH! 爆掉了

分析结果 :php内存溢出
原理:在做数据统计分析时,经常会遇到大数组,可能会发生内存溢出
ini_set(‘memory_limit’,’64M’); //重置php可以使用的内存大小为64M。
在运行到5000条查询的时候就已经60M了。所以挂了
本人的解决方案
1.利用curl多线程调用方法,避免一次性的给mysql和php 造成压力。 请看文章curl模拟多线程
2.线程数是根据数据条数来设定的,每1000条数据一个线程,3W条数据生成30个线程,每个线程生成一个csv文件。
3.文件的命名方式按照筛选条件来进行命名。文件生成后,在读取所有文件写到一个文件里面去。
后话:我开始做方案的时候,并没有具体分析问题。现在分析完问题,是内存溢出了。那我完全可以分段写入啊。
先读取1000条,写入csv文件,unset销毁变量。
在读1000条,在写入,销毁变量。
直到把数据都写进去。
测试方案行不行
echo '开始内存:'.memory_get_usage(), '</br>';
$tmp1=$car_model->take(1000)->get()->toArray();
unset($tmp1);
$tmp2=$car_model->take(1000)->get()->toArray();
unset($tmp2);
$tmp3=$car_model->take(1000)->get()->toArray();
unset($tmp4);
$tmp4=$car_model->take(1000)->get()->toArray();
echo '运行后内存:'.memory_get_usage(), '</br>';
unset($tmp4);
echo '回到正常内存:'.memory_get_usage();
die;

居然和只执行1000条内存占用是一样的
不过多线程不需要等待上一次执行完成,可能会快点,但是增加了网络传输。
php大量数据 10M数据从查询到下载 【内存溢出,查询过慢】解决方案的更多相关文章
- 010.简单查询、分组统计查询、多表连接查询(sql实例)
-------------------------------------day3------------ --添加多行数据:------INSERT [INTO] 表名 [(列的列表)] --SEL ...
- 关系数据库SQL之高级数据查询:去重复、组合查询、连接查询、虚拟表
前言 接上一篇关系数据库SQL之基本数据查询:子查询.分组查询.模糊查询,主要是关系型数据库基本数据查询.包括子查询.分组查询.聚合函数查询.模糊查询,本文是介绍一下关系型数据库几种高级数据查询SQL ...
- Oracle的学习二:表管理(数据类型、创建/修改表、添加/修改/删除数据、数据查询)
1.Oracle表的管理 表名和列名的命名规则: 必须以字母开头: 长度不能超过30个字符: 不能使用oracle的保留字: 只能使用如下字符:A-Z, a-z, 0-9, $, # 等. Oracl ...
- Oracle数据库--解决单张表中数据量巨大(大数据、数据量上百万级别,后查询,更新数据等耗时剧增)
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/QQ578473688/article/details/54561397 思路1:采用备份表 备份表中 ...
- 【Java】数据库查询的数据直接以指定文件类型下载到本地(弹出下载框)
欲实现的功能目标:当点击下图的导出数据文件时弹出文件下载框,默认csv格式,用户自定义下载的本地路径 遇到的问题: 1.项目之前做过一次下载,但是是使用了本地文件模板.用输入流读取文件模板,插入数据, ...
- php查询mysql返回大量数据结果集导致内存溢出的解决方法
web开发中如果遇到php查询mysql返回大量数据导致内存溢出.或者内存不够用的情况那就需要看下MySQL C API的关联,那么究竟是什么导致php查询mysql返回大量数据时内存不够用情况? 答 ...
- mysq表的三种关系,数据的增删改以及单表多表查询
一丶三种关系 分析步骤: #.先站在左表的角度去找 是否左表的多条记录可以对应右表的一条记录,如果是,则证明左表的一个字段foreign key 右表一个字段(通常是id) #.再站在右表的角度去找 ...
- 10Oracle Database 数据表数据查询
Oracle Database 数据表数据查询 DML 数据操纵语言 - 数据的查看和维护 select / insert /delete /update 基本查询语句 Select [distinc ...
- Django——8 关系表的数据操作 表关联对象的访问 多表查询
Django 关系表中的数据操作 表关联对象的访问 关联对象的add方法 create方法 remove方法 clear方法 多表查询 查询补充 聚合查询 分组查询 F查询 Q查询 关系表的数据操作 ...
随机推荐
- hadoop day 3
1.map:局部处理:reduce:汇总 mapper对数据做切分,一份程序在不同的DataNode上独立运行对数据进行处理,reduce程序将所有DataNode上的统计数据进行汇总 Mapper& ...
- phpstorm使用zen coding 快速编辑补全html/css代码
百科定义: 使用仿CSS选择器的语法来快速开发HTML和CSS ——由Sergey Chikuyonok开发. Zen Coding由两个核心组件组成:一个缩写扩展器(缩写为像CSS一样的选择器)和上 ...
- TX2-static-dhcp-network
前言 之前是使用私有的镜像而不是按照nvidia官网中JetPack3.2套件的镜像对TX2板子进行刷机,刷机之后发现网络不能正常连接,即使已经连接了有线网口,经过大师的指点才终于明白了其中的一点点奥 ...
- 【opencv基础】linux系统卸载opencv
找到opencv某个版本的源码文件,进入build目录: cd opencv_build sudo make uninstall cd .. sudo rm -r build sudo rm -r / ...
- Java中的方法重载
一.什么是方法重载? 方法重载就是两个或多个方法的方法名相同,但是方法的形参类型,数量,顺序不同. 上面提到的三点也就是一个方法的特征标,只要有一点不相同,则该方法就不相同,就可以实现重载. 在这里的 ...
- markdown-to-html.min.js
直接改成 false 不执行这里 不然异步了
- POJ3525:Most Distant Point from the Sea(二分+半平面交)
pro:给定凸多边形,求凸多边形内的点到最近边界的最远距离. sol:显然是二分一个圆,使得圆和凸多边形不相交,但是这样很难实现. 由于是凸多边形,我们可以把二分圆转化为二分凸多边形的移动. 如果每一 ...
- select的width和input的width
select的width包括了border,而input不包括
- fast ai环境配置
https://www.jianshu.com/p/2fe22a6b0ecb https://www.jianshu.com/p/b1be2af2f2ef https://blog.csdn.net/ ...
- Python 3 运行 shell 命令
#python 3.5 , win10 引入包 #os.chdir('path') import osimport subprocess #https://docs.python.org/3.5/li ...