我有一个搜索功能,我将实体的所有记录返回到用户的searh按钮,现在记录了多少(现在,它能够搜索50,000条记录)。现在我试图在csv中下载所有这些记录。如果记录较少,那么它的工作正常,但当它超过30,000时,它正在抛出
编辑: -
解决方案: - 使用了这些代码行
InputStream in = new ByteArrayInputStream(buffer.toString().getBytes("UTF-8"));
ServletOutputStream out = response.getOutputStream();
byte[] outputByte = new byte[4096];
while(in.read(outputByte, 0, 4096) != -1)
{
out.write(outputByte, 0, 4096);
}
in.close();
out.flush();
out.close();*/
答案 0 :(得分:2)
不是将所有内容写入内存缓冲区中的巨型内容,而是在内存中创建巨型内存字符串副本,而是从Writer
获取HttpServletResponse
并在创建时将CSV直接写入客户端。通过这种方式,您可以将数据从网络中刷新到客户端,而不必在发送整个内容之前将其整个副本保留在RAM中。
当然,也可以让堆更大!
答案 1 :(得分:1)
您应该考虑通过套接字传输记录,而不是尝试将它们全部缓冲在内存中。这可能需要您将OutputStream传递给生成csv的代码。
或者运行你的服务器有更多的内存,但这真的不是一个好的答案,因为你只是推迟了另一天的OOM异常。