数据报表导出功能改进

一、           前言

财务在每月月底做财务数据统计时,需要统计每月产品的出货单及退货单报表数据,故要求在每月月底要汇总当月的报表数据,每一季度或者半年也要相应的统计报表数据,并能把数据导出到excl表格,所以数据报表导出功能则是必然的。财务提供的excel表格字段繁多,汇总下关联到数据库表达到7张以上,故在进行出货单或者退货单报表查询之时,由于涉及到多张表关联,故每次查询都需要耗费相当多的时间和空间。

二、           实现

数据报表只需要按照起始时间和结束时间进行查询和导出。以出货单为例,历史数据累计至今的出货单以上万至几十万之多。早期的导出功能是实时查询并导出,在选择时间段进行数据导出之时,如果时间跨度太大,后台执行太久的话会导致前端页面显示错误信息,或者等待时间过长让财务人员误以为导出失败,用户体验也不是很好。

三、           优化

a)         从服务器架设上优化

考虑到我们是采用LAMP的服务器架构,PHP是部署到Linux环境下,可以尝试利用Linux提供的工具配合PHP使用。

用户使用的场景主要是财务人员查询的基本上都是历史或者已成型的数据,故我们可以在服务器空闲期间使用PHP-CLI方式后台执行生成数据并插入到新设计的数据表中,用户在使用过程中可以选取缓存数据导出报表的方式来生成excel数据。借助于Linux环境下Crontab工具可以实现此情景。具体的Crontab命令参考如下:

/usr/local/php-5.4.26/bin/php

-f /data/www/wms/index.php cli/crontab_report/export_to_db

b)        分批执行

后台执行Crontab命令之时,如果一次性把所有数据通过SQL检索出来再进行插入的话,在中间如果出现异常退出之时,则会导致前期所做的工作付之流水。且PHP本身在执行期间是会耗费内存的,是有可能出现异常退出的情况,故可以采用类似分页查询的方式对数据进行分批处理并插入。目前采用的是每一批次采用300条出货单检索并插入。

c)         PHP执行内存设置

在PHP脚本执行期间,是有内存消耗的,正常情况下在PHP执行完脚本之后会自动释放相应内存,但如果当前执行的脚本将要花很长时间并占用比较大的资源之时,则会导致PHP执行内存达到一定上限而导致异常退出。使用PHP提供的memory_get_usage()函数我们可以查看在后台执行PHP脚本所耗费的内存。采用上述B分批执行方式,每一批次采用300条数据检索并插入,计算出内存差可算出检索出300条记录需要耗费大致1.6M内存,插入操作消耗128K数据,查询PHP配置参数memory_limit为96M,实际可插入数据13000-15000左右数据之后则会异常退出,并且查不出错误信息。

我们可以通过增大memory_limit参数值来延长PHP执行时间,有三种方式可以设置此参数,一种是修改php.ini中的memory_limit参数,此方式对整个php环境影响较大,也可以使用ini_set()函数临时设置为指定的memory_limit大小,同样的在相应网站有.htaccess文件的时候也可以修改类似如下php_value memory_limit 16M。实际测试环境下,通过ini_set设置memory_limit为256M之时,实际可插入的数据达到42077条。

d)        执行期间实时释放相应内存

上述C方式是采用扩大memory_limit的值来延长PHP的执行时间,但仍不可避免有些历史数据是无法生成的,表现为只能缓存之前4-5个月数据,当然此情况也基本满足要求。上述提到在检索300条记录时需要耗费1.7M内存,这消耗的资源是挺大的,我们可以采用类似C语言的方式,在不需要的时候把它释放掉,上述情景主要都是与数据库相关,我们只要保证在检索到相应参数并确认此在后续无用之时把他释放掉,相应PHP函数是mysql_free_result,CI框架已做了封装,调用CI的free_result函数即可。同样的相应的数据在使用完之后可以通过unset函数来释放相应的PHP内存。

四、           参考文档

1) PHP修改memory_limit的三种办法

http://blog.chinaunix.net/uid-17085332-id-2832158.html

2)PHP查看内存使用情况:

http://blog.csdn.net/duotuu/article/details/7554207

时间: 2024-10-28 06:58:58

数据报表导出功能改进的相关文章

【HOW】如何限制Reporting Services报表导出功能中格式选项

Reporting Services报表导出功能中缺省会提供多种导出格式选项,但很多情况下不需要全部的格式选项,因此需要对这些选项进行限制.下面我们以SQL Server 2008 R2为例来说明对这些选项进行限制的方法. 1. 打开报表服务配置文件:"C:\Program Files\Microsoft SQL Server\MSRS10_50.QUIST\Reporting Services\Report Server\ rsreportserver.config". 2. 在上述

Jxl、JxCell图表导出功能的实现

最近接触过许多报表导出功能,也用过多种工具进行导出功能的实现,但对于图表的导出一直没有仔细的去展开研究和探讨,直到最近略微整理了下这方面的需求和技术攻克. 首先导出excel功能的实现主要有JXL.JXCELL.POI等工具.目前只实现了JXL和JXCELL. JXL: 先介绍下JXL: jxl是一个韩国人写的java操作excel的工具, 在开源世界中,有两套比较有影响的API可 供使用,一个是POI,一个是jExcelAPI.其中功能相对POI比较弱一点.但jExcelAPI对中文支持非常好

Linux下mongodb安装及数据导入导出教程

Linux下mongodb安装及数据导入导出教程 #查看linux发行版本 cat /etc/issue #查看linux内核版本号 uname -r 一.Linux下mongodb安装的一般步骤 1.到mongodb的官网(https://www.mongodb.org/downloads) 下载相应你系统的安装包,拷贝(能够用ftp工具如winscp)到你的linux系统上面. 2.解压相应的安装包 命令例如以下:tar zxvf mongodb-linux-x86_64-3.0.4.tgz

Dynamics CRM 报表导出EXCEL 列合并问题的解决方法

CRM中的报表导出功能提供了多种格式,excel就是其中之一,这次遇到的问题是导出后打开excel列明合并的问题,具体如下看着相当不美观,物料名称字段占了AB两列,品牌占了CD两列等等. 该问题的源头在于上图中我标注的3个区域,打开编辑器查看报表如果3个区域各自对应的左右边框没有和表的某一列对齐就会出现表1中的问题,所以要解决这个问题只需将3个区域各自对应的边框和表格的某一列对齐即可. 

利用Aspose.Cells完成easyUI中DataGrid数据的Excel导出功能

我准备在项目中实现该功能之前,google发现大部分代码都是利用一般处理程序 HttpHandler实现的服务器端数据的Excel导出,但是这样存在的问题是ashx读取的数据一般都是数据库中视图的数据,难免会含有方便操作的 主键ID这列的记录.现在项目需要在easyUI的DataGrid中显示的数据能全部导出Excel,包括DataGrid中的中文标题,其他的统统不 要. 完成该功能所需的工具和环境:Newtonsoft.Json序列化和反序列化类库.easyUI前端UI框架.HttpHandl

基于Android MPAndroidChart实现腾讯QQ群数据统计报表核心功能

 基于Android MPAndroidChart实现腾讯QQ群数据统计报表核心功能 腾讯QQ移动客户端(新版)的QQ群有一项功能比较有趣,是关于QQ群的.QQ群新增一项功能开放给具有管理权限的群成员:管理群 -> 群数据 中,会看到QQ群的一些基础数据统计报表,如人数.发言条数的统计报表,如图: 我之前写了一篇文章是关于Android平台上的一个统计报表的开源框架MPAndroidChart,文章介绍了如何在自己的项目中使用MPAndroidChart制作统计报表,同时给出了基本折线图的一

实现excel导入导出功能,excel导入数据到页面中,页面数据导出生成excel文件

今天接到项目中的一个功能,要实现excel的导入,导出功能.这个看起来思路比较清楚,但是做起了就遇到了不少问题. 不过核心的问题,大家也不会遇到了.每个项目前台页面,以及数据填充方式都不一样,不过大多都是以json数据填充的.在导入excel填充json数据到页面时,真的让我差点吐血了.在做这个导入导出的时候,那一个礼拜都是黑暗的. 好了,废话不多说了,我今天就给大家展示这个两个功能的核心点,excel生成json数据和json数据生成excel文件. 一:从上传文件到服务器,后台java解析,

excel导出功能优化

先说说优化前,怎么做EXCEL导出功能的: 1. 先定义一个VO类,类中的字段按照EXCEL的顺序定义,并且该类只能用于EXCEL导出使用,不能随便修改. 2. 将查询到的结果集循环写入到这个VO类中. 3. 将这个VO类的数据集写入到EXCEL中. 缺点: 1.每次做一个功能的excel导出需要定义一个vo类,并且vo类不可随便变更. 2. 从数据库查询到结果集不能直接输出到excel,需要二次遍历写入到vo中. 3. excel导出的顺序必须与vo定义的字段顺序一致,并且输出vo中所有的字段

数据报表之Excel操作模块

Excel是当今最流行的电子表格处理软件,支持丰富的计算函数及图表,在系统运营方面广泛用于运营数据报表,比如业务质量.资源利用.安全扫描等报表,同时也是应用系统常见的文件导出格式,以便数据使用人员做进一步加工处理.本节主要讲述利用Python操作Excel的模块XlsxWriter(https://xlsxwriter.readthedocs.org),可以操作多个工作表的文字.数字.公式.图表等.XlsxWriter模块具有以下功能: 100%兼容的Excel XLSX文件,支持Excel 2