php导出超大csv导出方法,读取超大文件或者接受超大数组,防止内存溢出
基本思路就是,知道总数之后分割成2万一个数组进行查询,最后独立写入csv,避免数据过大导致溢出
速度还不错,在php7下,机器I5 8G内存,128G,SSD,52W多条,大概也就30秒,出来整个文件38.2M
$per = 10000; 37秒
$per = 20000; 34秒
$per = 30000; 的时候速度最快29秒左右
$per = 40000;30-31秒
所以建议在30000步幅,比较好,我的环境是windows 32位,64位或许会更好
建议导入文件过多就zip压缩之后再下载
laravel 写的demo 2018年6月19日18:13:26
$start = time();
set_time_limit(0);
ini_set('memory_limit', '512M');
//获取总数
$count = DataChinaYearData::count();
//
$per = 30000; $section = array();
for ($i = 0; $i <= $count; $i += $per) {
$section[] = $i;
}
if (end($section) < $count) {
$section[] = $count;
}
//清理输出流的防止乱码
ob_flush();
flush();
$fp = fopen('file.csv', 'w'); foreach ($section as $k => $v) {
$list = array();
$list = DataChinaYearData::offset($v)->limit($per)->get()->toArray();
foreach ($list as $fields) {
fputcsv($fp, $fields);
}
unset($list); //防止溢出
ob_flush();
flush();
}
fclose($fp);
$end = time(); $time = $end - $start;
echo $time . '秒';
另一种懒人写法,全部使用迭代器去操作
$start = time();
set_time_limit(0); $fp = fopen('file.csv', 'w');
foreach (new \ArrayObject(DataChinaYearData::get()->toarray()) as $k => $v) {
fputcsv($fp, $v);
}
fclose($fp);
$end = time();
$time = $end - $start;
echo $time . '秒';
原理也很简单,pdo就是迭代器,直接使用数组迭代器赋值,不使用变量接收就不会内存溢出
测试了2次,39秒和40秒,显然这样的速度就慢了一些,可以通过逻辑优化的就使用逻辑优化,纯靠语言特性优化有时候是方便了写代码但是代码思维逻辑就差多了
也可以通过使用迭代器接受超大数组,比如我需要读取一个2G或者更大的文本文件或者excel,我直接按行读取,然后全部放入迭代器中这样不会出现内存溢出的情况
伪demo,有时间在写个实际的demo
public static function test() {
pp(self::get_array() instanceof \Generator);
pp(self::get_array());
/*
* Generator Object
(
)
*
*/
foreach (self::get_array() as $k => $v) {
p($k);
p($v);
}
}
public static function get_array() {
$rr = array('0' => array('a' => 'aa'), '1' => array('a' => 'bb'), '2' => array('c' => 'cc'), '3' => array('d' => 'dd'));
// $rr = array('0' => 'a', '1' => 'b', '2' => 'c', '3' => 'd');
foreach ($rr as $k => $v) {
yield $k => $v;
}
}
php导出超大csv导出方法,读取超大文件或者接受超大数组,防止内存溢出的更多相关文章
- C# oleDb方法读取Excel文件
今天学习的是从FTP上下载Excel文件,DataTable接收数据之后,在DataTable中通过筛选,删减修改之后把数据插入到DB相应表中. 优点:读取方式简单.读取速度快 缺点:除了读取过程不太 ...
- 逐行读取txt文件并存入到数组中
get_file_contents_on_line.php $file = fopen("log.txt", "r"); $user=array(); $i=0 ...
- Android studio运行时报错,方法,类找不到,或者JVM内存溢出解决方案
Error:Execution failed for task ':app:dexDebug'. > com.android.ide.common.process.ProcessExceptio ...
- java 读取本地文件并转换为byte数组
private byte[] InputStream2ByteArray(String filePath) throws IOException { InputStream in = new File ...
- POI实现大数据EXCLE导入导出,解决内存溢出问题
使用POI能够导出大数据保证内存不溢出的一个重要原因是SXSSFWorkbook生成的EXCEL为2007版本,修改EXCEL2007文件后缀为ZIP打开可以看到,每一个Sheet都是一个xml文件, ...
- Spark Scala 读取GBK文件的方法
1. 在生产环境下,很多文件是GBK编码格式的,而SPARK 常用的textFile方法默认是写死了读UTF-8格式的文件,其他格式文件会显示乱码 用如下代码实现读取GBK文件的方法 import o ...
- java 读取TXT文件的方法
java读取txt文件内容.可以作如下理解: 首先获得一个文件句柄.File file = new File(); file即为文件句柄.两人之间连通电话网络了.接下来可以开始打电话了. 通过这条线路 ...
- java读取TXT文件的方法
java读取txt文件内容.可以作如下理解: 首先获得一个文件句柄.File file = new File(); file即为文件句柄.两人之间连通电话网络了.接下来可以开始打电话了. 通过这条线路 ...
- Java关于读取Excel文件~xlsx xls csv txt 格式文件~持续汇总~
所需的jar百度网盘链接:https://pan.baidu.com/s/146mrCImkZVvi1CJ5KoiEhQ提取码:c329 1 需要导入jar包,缺1不可 dom4j-1.6.1.jar ...
随机推荐
- 转发:entos7修改文件夹权限和用户名用户组
Linux系统下经常遇到文件或者文件夹的权限问题,或者是因为文件夹所属的用户问题而没有访问的权限.根据我自己遇到的情况,对这类问题做一个小结.在命令行使用命令“ll”或者“ls -a”,可以查看文件或 ...
- oracle无效索引重建
问题描述: 执行失败!错误信息[Exception message:无效的列索引 解决思路: 分析是表索引,大部分都是表索引失效导致的,只需要花重建表索引即可! 00.查看此表归属账户select * ...
- Django表单介绍
HTML 表单 在HTML中,表单是<form>...</form> 之间元素的集合,它们允许访问者输入文本.选择选项.操作对象和控制等等,然后将信息发送回服务器. 某些表单的 ...
- MATLAB 程序处理结果出现 NAN 问题
1)0/0 或者说 任意常数/0 也就是0不能做分母. (nan出现的情况绝大部分是分母出现0了) 若分子为0的情况,(分母不为0),结果也应该是0而非 NAN. 2)如果是 无穷大比无穷大 ...
- 【VS2019】F12跳转到源码,关闭浏览器不停止项目【转】
[VS2019]F12跳转到源码 1.工具->选项 2.文本编辑器->C#->高级->勾选支持导航到反编译源码 3.关闭浏览器不停止项目
- .net core 2.0+superui +Dapper.SimpleCRUD+mysql+NLog
**_ .net core 2.0+superui +Dapper.SimpleCRUD+mysql+NLog _** 前端框架 superui http://www.supermgr.cn/ 1.组 ...
- MySQL遇到Deadlock found when trying to get lock,解决方案
最近遇到一个MYSQL update语句出现Deadlock found when trying to get lock的问题,分析一下原因. 什么情况下会出现Deadlock found when ...
- npm安装教程
一.使用之前,我们先来掌握3个东西是用来干什么的. npm: Nodejs下的包管理器. webpack: 它主要的用途是通过CommonJS的语法把所有浏览器端需要发布的静态资源做相应的准备,比如资 ...
- JVM类加载机制与反射-转
一.Java类加载机制 1.概述 Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数,属性和方法等,Java允 ...
- 二叉树遍历-c实现
这里主要是三种遍历,先序(preorder,NLR),中序(Inorder,LNR),后序(Postorder,LRN) N:node,L:left,R:right 基本排序:先序(NLR,节点,左, ...