编程要正规,但也不能太拘泥于形式
2009-07-01 11:20
162 查看
刚才在论坛发现了一个问题,从数据库读取数据,然后生成Excel文件并输出。
按照标准的流程,应该一个方法进行数据的操作,并返回一个结果,比如一个List
然后将这个结果作为参数传递给ExcelExport 的类,让其进行文件的输出操作。这样做从理论上一点问题都没有,但在特殊情况下,确是不行的。比如:
数据量有11W的样子,我进行封装然后放入List中,mian方法中打印看一下,没想到马上就OutOfMemery了,郁闷……不知道这样要怎么优化一下,最好不是改JVM……
我这次要解决的问题是把大概10左右的数据提出来,再转成Excel格式的文件,没想到取数据就发生问题了……
我的答复:
我提供一个方法
在读取数据的时候,立即生成Excel,读取一行,生成一行。
不要用List做中转。
不要拘泥于什么模式,在特殊情况下,就要用特殊的手段。
比如,你的数据有1T,也就是1000G,难道你也要全部读取出来,放到List里面吗?
在许多时候,流方式操作,总是能解决内存占用的问题的。
比如你用Hibernate 进行大结果集的查询,并返回List, 我想危险就很大,比如用JDBC进行 ResultSet的Next 更有效,更安全。
按照标准的流程,应该一个方法进行数据的操作,并返回一个结果,比如一个List
然后将这个结果作为参数传递给ExcelExport 的类,让其进行文件的输出操作。这样做从理论上一点问题都没有,但在特殊情况下,确是不行的。比如:
数据量有11W的样子,我进行封装然后放入List中,mian方法中打印看一下,没想到马上就OutOfMemery了,郁闷……不知道这样要怎么优化一下,最好不是改JVM……
我这次要解决的问题是把大概10左右的数据提出来,再转成Excel格式的文件,没想到取数据就发生问题了……
我的答复:
我提供一个方法
在读取数据的时候,立即生成Excel,读取一行,生成一行。
不要用List做中转。
不要拘泥于什么模式,在特殊情况下,就要用特殊的手段。
比如,你的数据有1T,也就是1000G,难道你也要全部读取出来,放到List里面吗?
在许多时候,流方式操作,总是能解决内存占用的问题的。
比如你用Hibernate 进行大结果集的查询,并返回List, 我想危险就很大,比如用JDBC进行 ResultSet的Next 更有效,更安全。
相关文章推荐
- 134 编程实现:把十进制数(long 型)分别以二进制和十六进制形式输出,不能使用 printf系列
- 把十进制数(long型)分别以二进制和十六进制形式输出,不能使用printf系列库函数
- centos shell编程5 LANMP一键安装脚本 lamp sed lnmp 变量和字符串比较不能用-eq cat > /usr/local/apache2/htdocs/index.php <<EOF重定向 shell的变量和函数命名不能有横杠 平台可以用arch命令,获取是i686还是x86_64 curl 下载 第三十九节课
- ADO编程:_ConnectionPtr 等不能识别的问题
- 注意:编程中的一个注意事项!!不能以Con命名类
- Android编程实现对话框形式进度条功能示例
- 编程不能创建内建体量
- 渣渣用JavaScript开发的消消乐,由于没有按照正规消消乐形式生成,是随机产生图形,所以存在一个算法bug,具体看下面,高手想到可以告诉我
- 为什么 script 标签不能写成自关闭形式
- 如何解决编程中Excel不能读取的问题
- VC++与Matlab混合编程之二:调用Matlab中M函数转换成DLL文件的形式
- 编程实现两个正整数的除法,当然不能用除法操作符
- Protel PAD焊盘不能设置成通孔形式
- 这种形式,不能将 this 传递吗?
- WIN64驱动编程基础教程(福利:过WIN7/8/8.1签名强制的LIB、过WIN7“补丁守卫”的SRC、吊销的正规数字签名)
- Python While循环语句 Python 编程中 while 语句用于循环执行程序,即在某条件下,循环执行某段程序,以处理需要重复处理的相同任务。其基本形式为: while 判断条件:
- 关于exe形式编程的一点心得,希望对大家有所帮助
- 使用codeblocks编程运行时终端不能复制粘贴
- 关于DSP/BIOS的编程的CMD文件不能修改的两个问题 .
- 把十进制数(long型)分别为二进制和十六进制形式输出,不能使用printf