友
在我的应用程序中,我遇到了一个场景,用户可能会要求将报告下载为平面文件,最多可能有17个Lakhs记录(大约650 MB)的数据。在此请求期间,我的应用程序服务器停止服务其他线程或发生内存不足异常。
截至目前,我正在遍历结果集并将其打印到文件中。
当我谷歌出来时,我遇到了一个名为OpenCSV的API。我也尝试了,但我没有看到性能有任何改善。
请帮我解决这个问题。
try {
response.setContentType("application/csv");
PrintWriter dout = response.getWriter();
while(rs.next()) {
dout.print(data row); // Here i am printing my ResultSet tubles into flat file.
dout.print("\r\n");
dout.flush();
}
答案 0 :(得分:2)
OpenCSV将干净利落地处理CSV格式的怪癖,但是大型报告仍然是一份大型报告。看一下具体的内存错误,听起来你需要增加Heap或Max Perm Gen空间(这将取决于错误确定)。没有任何调整,JVM只会占用固定数量的RAM(我的经验是这个数字是64 MB)。
答案 1 :(得分:1)
如果您只将结果集中的数据流式传输到文件而不使用大缓冲区,那么这应该是可能的,但是您可能首先在发送到文件之前将数据收集在不断增长的列表中?所以你应该调查这个问题。
请更多地指出您的问题,否则我们必须推测。
答案 2 :(得分:0)
CSV格式不再受内存的限制 - 也许只有在预先填充CSV数据的过程中,这也可以有效地完成,例如使用例如LIMIT / OFFSET从DB查询行的子集并立即将其写入文件,而不是在写入任何行之前将整个数据库表内容拖入Java的内存中。一个“工作表”中行数量的Excel限制将增加到大约一百万。
大多数体面的数据库都有一个导出到CSV的功能,可以毫无效率地完成这项任务。在例如MySQL的情况下,您可以使用LOAD DATA INFILE命令。