我正在尝试根据hibernate查询的结果生成CSV,它可能包含多达200k行,并且在创建时,CSV可能大约为30MB。
我正在努力让表演接近可接受的程度。 目前我的hibernate查询将返回一个对象列表。 然后我使用StringBuilder生成CSV字符串。 然后我从中获取一个字节数组,并将字节数组传递给response.outputstream.write()方法。
为了有效地生成这样大小的CSV,我应该怎么做?
我的服务
List<Object> objectList = hibernateDao.getObjectList(objectList);
StringBuilder sb = new StringBuilder();
sb.append("field1_id,field2,field3,field14");
for(Object object : objectList){
sb.append("\n");
sb.append(object.field1());
sb.append(",");
sb.append(object.field2());
sb.append(",");
sb.append(object.field3());
...
...
sb.append(",");
sb.append(object.field14);
}
byte[] bytes = sb.toString().getBytes();
return bytes;
我的控制器将获得结果字节[]
response.setHeader("Content-Type", "text/comma-separated-values");
response.getOutputStream().write(objectService.getListByteArray());
答案 0 :(得分:0)
问题最初出现在您的StringBuilder
扩展中,您可以初始化它以分配大量字符,但是您尝试编写的内容的长度可能超过Integer.MAX_VALUE
( <{1}}的最大长度,您将收到缓冲区溢出错误。
还有一个潜在的问题,即在单独编写的值中转义逗号和引用字符。这很难处理,我建议您使用CSV库以确保获得正确的输出。
尝试uniVocity-parsers来保留您的对象。您可以使用一些注释将特定字段序列化为CSV。
免责声明:我是这个库的作者,它是开源和免费的(Apache 2.0许可证)