功能描述:做数据导出

功能分析: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数据从查询到下载 【内存溢出,查询过慢】解决方案的更多相关文章

  1. 010.简单查询、分组统计查询、多表连接查询(sql实例)

    -------------------------------------day3------------ --添加多行数据:------INSERT [INTO] 表名 [(列的列表)] --SEL ...

  2. 关系数据库SQL之高级数据查询:去重复、组合查询、连接查询、虚拟表

    前言 接上一篇关系数据库SQL之基本数据查询:子查询.分组查询.模糊查询,主要是关系型数据库基本数据查询.包括子查询.分组查询.聚合函数查询.模糊查询,本文是介绍一下关系型数据库几种高级数据查询SQL ...

  3. Oracle的学习二:表管理(数据类型、创建/修改表、添加/修改/删除数据、数据查询)

    1.Oracle表的管理 表名和列名的命名规则: 必须以字母开头: 长度不能超过30个字符: 不能使用oracle的保留字: 只能使用如下字符:A-Z, a-z, 0-9, $, # 等. Oracl ...

  4. Oracle数据库--解决单张表中数据量巨大(大数据、数据量上百万级别,后查询,更新数据等耗时剧增)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/QQ578473688/article/details/54561397 思路1:采用备份表 备份表中 ...

  5. 【Java】数据库查询的数据直接以指定文件类型下载到本地(弹出下载框)

    欲实现的功能目标:当点击下图的导出数据文件时弹出文件下载框,默认csv格式,用户自定义下载的本地路径 遇到的问题: 1.项目之前做过一次下载,但是是使用了本地文件模板.用输入流读取文件模板,插入数据, ...

  6. php查询mysql返回大量数据结果集导致内存溢出的解决方法

    web开发中如果遇到php查询mysql返回大量数据导致内存溢出.或者内存不够用的情况那就需要看下MySQL C API的关联,那么究竟是什么导致php查询mysql返回大量数据时内存不够用情况? 答 ...

  7. mysq表的三种关系,数据的增删改以及单表多表查询

    一丶三种关系 分析步骤: #.先站在左表的角度去找 是否左表的多条记录可以对应右表的一条记录,如果是,则证明左表的一个字段foreign key 右表一个字段(通常是id) #.再站在右表的角度去找 ...

  8. 10Oracle Database 数据表数据查询

    Oracle Database 数据表数据查询 DML 数据操纵语言 - 数据的查看和维护 select / insert /delete /update 基本查询语句 Select [distinc ...

  9. Django——8 关系表的数据操作 表关联对象的访问 多表查询

    Django 关系表中的数据操作 表关联对象的访问 关联对象的add方法 create方法 remove方法 clear方法 多表查询 查询补充 聚合查询 分组查询 F查询 Q查询 关系表的数据操作 ...

随机推荐

  1. Java 面试题 —— java 源码

    1. 静态工厂方法 静态工厂方法不必在每次调用它们的时候都创建一个新的对象: Boolean.valueOf(boolean): public final class Boolean { public ...

  2. Sublime Text 3(中文)添加Lua编译环境

    Sublime Text 3(中文)添加Lua编译环境 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 没有 ...

  3. python学习1 ---range()函数

    奇怪的现象 在paython3中 print(range(10)) 得出的结果是 range(0,10) ,而不是[0,1,2,3,4,5,6,7,8,9] ,为什么呢? 官网原话: In many ...

  4. P2157 [SDOI2009]学校食堂 (dp+状态压缩)

    题目链接:传送门 题目: 题目描述 小F 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满意的菜肴.当然,不同的人口味也不一定相同,但每个人 ...

  5. rsync命令

    1.rsync命令(文件同步工具,可以理解为动态备份): rsync是linux系统下的数据镜像备份工具.使用快速增量备份工具Remote Sync可以远程同步,支持本地复制,或者与其他SSH.rsy ...

  6. rest-framework之视图

    rest-framework之视图 本文目录 一 基本视图 二 mixin类和generice类编写视图 三 使用generics 下ListCreateAPIView,RetrieveUpdateD ...

  7. (25)Django中操作cookie与session组件(添加cookie和删除cookie)

    cookie是存在于客户端浏览器上的键值对,是明文的 cookie是当用户访问网站时候和数据提起携带过去,安全性比较差, 容易被拦截 session存在于服务端的键值对,是一串加密的字符串 当用户登陆 ...

  8. 用Git向gitHub上传项目

    用Git向gitHub上传项目 1.安装git 2.在git安装目录下,运行git-bash.exe  如图所示 3.在git中绑定你注册gitHub是的用户名.邮箱. $ git config -- ...

  9. 利用JavaScript jQuery实现图片无限循环轮播(不借助于轮播插件)-----转载

    前言 作为一个前端工程师,无论公司是什么行业,无论你做什么端,基本都会遇到一个避不开的动画效果:循环轮播.做轮播并不难,市场上的轮播插件有很多,其中比较著名的是swiper,使用也非常简单.但轮播插件 ...

  10. linux服务器进程信息查看命令

    #lsof 列出当前系统打开文件,常与-i选项使用,用于查看某个端口被哪个程序占用 [root@bogon ~]# lsof -i:80 COMMAND PID USER FD TYPE DEVICE ...