生成器来解决大文件读取,大数据下载

目录

  • 场景
  • 下载文件
  • 读取大文件

场景

电商平台想要导出一年的报表数据,数据可能有百万,平常的做法是查出所有数据放到数组或对象中,再进行excel导出,一般情况下,数据不是很多这种是没什么问题,但百万级别的数据一下读到内存中,服务器会一下崩溃,内存溢出。通常情况下也不会做这种需求,产品提出来你可以骂两句怼回去,但老板说我就需要这个功能,你苦口婆心说几句,但是还是要做啊。生成器可以帮我做到这些,理解概念可以看看这里

下载文件

  //实现下载大文件,解决内存溢出
    public function actionExport(){

        $filename =  'sun.csv'; //设置文件名
        header('Content-Type: text/csv');
        header("Content-Disposition: attachment;filename={$filename}");

        $fp = fopen('php://output', 'w');

        $sql = 'select * from "SCM_tbIOStockDtl"';

        //非迭代器实现  十万多条数据,导出csv服务器直接崩溃,内存溢出
//        $list = Yii::$app->db->createCommand($sql)->queryAll();

        //PDO::query() 本身由迭代器实现
        $pdo = new \PDO('pgsql:host=192.168.33.30;port=5432;dbname=jump', 'postgres', '123456');
        $pdo->setAttribute(\PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
        $list = $pdo->query($sql);

        foreach ( $list  as  $fields ) {
            fputcsv ( $fp ,  $fields );
        }

        fclose ( $fp );
    }

读取大文件

  //读取大文件
    public function actionRead(){

        $result = $this->readCsv(Yii::$app->basePath.'/web/file/sun.csv');

        foreach ($result as $v){
            echo "<pre>";
            var_dump( $v);
            echo "</pre>";
        }

    }

    #生成器
    function readCsv( $file ){

        $fp = fopen($file,'rb');

        while( !feof($fp) ){
            yield fgetcsv($fp);
        }

        fclose($fp);
    }

代码细节可以看我的github片段

原文地址:https://www.cnblogs.com/followyou/p/9494462.html

时间: 2024-10-09 19:01:49

生成器来解决大文件读取,大数据下载的相关文章

TCP协议传输大文件读取时候的问题

TCP协议传输大文件读取时候的问题 大文件传不完的bug 我们在定义的时候定义服务端每次文件读取大小为10240, 客户端每次接受大小为10240 我们想当然的认为客户端每次读取大小就是10240而把客户端的读下来的文件想当然大小每一次都加上10240 而实际上服务端发送文件send每次发送不一定是一次性把10240的文件传送完,可能分了好几次进行发送至缓冲区这我们实际文件大小就不一定是10240 解决办法: 1.对于每次服务端所发送的文件内容及大小都发送给客户端,让客户端一一对应读取 2.实时

一键解决pdf文件太大如何变小的难题

PDF文件是适用于文件下发,阅读等便捷的电子文件格式,在传输发送的过程中,我们PDF文件较大的情况下,就需要将PDF文件压缩,那么PDF文件太大如何变小呢?对于PDF文件压缩不是太了解的用户可能就想不到好的办法解决,本文将教大家一键解决pdf文件太大如何变小的难题. 1.首先,我们需要了解的是PDF文件进行压缩,我们这里是需要借助到一款叫作迅捷PDF转换器的软件,所以,现在需要做的就是打开浏览器,在电脑上下载安装.软件下载:pdf压缩器http://www.newasp.net/soft/213

gitlab使用过程中遇到大文件上传或下载失败的问题,总结一下

环境如下:gitlab服务器redhat,客户端环境mac os,如果是其他环境遇到问题仅供参考 如果gitlab上传代码提示: error: RPC failed; result=22, HTTP code = 411 该问题是由于客户端设置的http_post_buffer大小不足导致的,解决方法如下: 进入到工程所在的终端目录下执行: git config http.postBuffer 524288000 如果gitlab上传代码提示: error: RPC failed; result

javascript读取xml文件读取节点数据的例子

分享下用javascript读取xml文件读取节点数据方法. 读取的节点数据,还有一种情况是读取节点属性数据. <head> <title></title> <script type="text/javascript"> var objLength = null; var xmlHttp; var strurl = ""; function ajaxrequst() { if (window.ActiveXObject

【Linux运维】如何查找大文件或大目录

[Linux运维]如何查找大文件或大目录 目录 [Linux运维]如何查找大文件或大目录 一.如何查找大文件 case1: 查找当前系统中有哪儿文件的大小超过800MB case2: 查找当前系统中有哪儿文件的大小超过800MB,并且向看下文件的其他属性 case3:查找当前系统中有哪儿文件的大小超过800MB,并查看下文件的具体大小 case4:查找当前系统中有哪些文件的大小超过800MB, 并查看文件的具体大小,并对结果做个排序 二.如何查找Linux下的大目录 一.如何查找大文件 case

**大文件读取

python 读取文件方式: 1. read 一个字符一个字符的读出全部数据,放到内存 2. readline 一个字符一个字符的读出第一行,放到内存 3. readlines 一行一行的读出全部数据,放到内存 4. 直接通过文件对象读取 区别上述3中方式,逐行放入内存,不是全部放入内存. f = open('sp1.py', encoding='utf-8') for i in f: print(i) 读取大文件时,适合使用这种方式.

如何分发大文件、大文件传输解决方案-JS

前言:因自己负责的项目(jetty内嵌启动的SpringMvc)中需要实现文件上传,而自己对java文件上传这一块未接触过,且对 Http 协议较模糊,故这次采用渐进的方式来学习文件上传的原理与实践.该博客重在实践. 一. Http协议原理简介 HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且H

iOS开发网络篇—大文件的多线程断点下载(转)

http://www.cnblogs.com/wendingding/p/3947550.html iOS开发网络篇—多线程断点下载 说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了同时开启多条线程下载一个较大的文件.因为实现过程较为复杂,所以下面贴出完整的代码. 实现思路:下载开始,创建一个和要下载的文件大小相同的文件(如果要下载的文件为100M,那么就在沙盒中创建一个100M的文件,然后计算每一段的下载量,开启多条线程下载各段的数据,分别写入对应的文件部分). 项目中用到的主要

iOS开发网络请求——大文件的多线程断点下载

iOS开发中网络请求技术已经是移动app必备技术,而网络中文件传输就是其中重点了.网络文件传输对移动客户端而言主要分为文件的上传和下载.作为开发者从技术角度会将文件分为小文件和大文件.小文件因为文件大小比较小导致传输所需时间少传输就快,因此不太容易影响用户体验,可用的技术就多.而大文件因为文件大小比较大导致传输时间长,因此就需要考虑到各种用户体验,比如避免在上传下载文件过程中阻塞主线程影响用户体验,就需要使用到多线程技术:为了给用户友好的进度提示,因此又需要开发中跟踪数据上传和下载数据的变化:为