首先,我在从数据库中获取数据时遇到了问题,它占用了太多内存而失败了。我已经设置了 -Xmx1500M 并且我正在使用滚动 ResultSet 这样就可以解决了。现在我需要从数据中生成一个 XML,但我不能将它放在一个文件中。目前,我是这样做的:
while(rs.next()){
i++;
xmlStringBuilder.append("\n\t<row>");
xmlStringBuilder.append("\n\t\t<ID>" + Util.transformToHTML(rs.getInt("id")) + "</ID>");
xmlStringBuilder.append("\n\t\t<JED_ID>" + Util.transformToHTML(rs.getInt("jed_id")) + "</JED_ID>");
xmlStringBuilder.append("\n\t\t<IME_PJ>" + Util.transformToHTML(rs.getString("ime_pj")) + "</IME_PJ>");
//etc.
xmlStringBuilder.append("\n\t</row>");
if (i%100000 == 0){
//stores the data to a file with the name i.xml
storeKBR(xmlStringBuilder.toString(),i);
xmlStringBuilder= null;
xmlStringBuilder= new StringBuilder();
}
并且有效;我得到 12 100 MB 文件。现在,我想做的是将所有数据放在一个文件中(然后压缩),但如果只是删除 if 部分,我就会内存不足。我想尝试写入一个文件,关闭它,然后再打开,但这对我没有太大帮助,因为我必须在打开文件时将文件加载到内存中。
最佳答案
为什么不将所有数据写入一个文件并使用“追加”选项打开该文件?如果您只是要写入文件,则无需读入文件中的所有数据。
但是,这可能是更好的解决方案:
PrintWriter writer = new PrintWriter(new BufferedOutputStream(new FileOutputStream("data.xml")));
while(rs.next()){
i++;
writer.print("\n\t<row>");
writer.print("\n\t\t<ID>" + Util.transformToHTML(rs.getInt("id")) + "</ID>");
writer.print("\n\t\t<JED_ID>" + Util.transformToHTML(rs.getInt("jed_id")) + "</JED_ID>");
writer.print("\n\t\t<IME_PJ>" + Util.transformToHTML(rs.getString("ime_pj")) + "</IME_PJ>");
//...
writer.print("\n\t</row>");
}
writer.close();
BufferedOutputStream 会在打印前缓冲数据,如果默认值不适合您的需要,您可以在构造函数中指定缓冲区大小。有关详细信息,请参阅 java API:http://java.sun.com/javase/6/docs/api/ .
关于java - 如何将大量数据从数据库存储到 XML(内存问题)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2895298/