【发布时间】:2019-06-14 10:07:21
【问题描述】:
我目前正在编写一个 java 代码,它允许我查询数据库并将其内容提取到文件中。
到目前为止,小请求没有问题。
但我很快将不得不提取大量数据,并且我已经尝试了几天来实施最有效的解决方案,以尽可能限制内存消耗。
因为我一发出重要请求,源机和目标机的内存就饱和了。
我在redhat linux环境下使用的java版本是java-1.8.0
到目前为止,我已经能够将我的查询结果重定向到一个文件。但是在查阅了大量文档后,我可以看到有很多不同的方法可以限制内存消耗。
DriverManager.registerDriver(new
com.wily.introscope.jdbc.IntroscopeDriver());
Connection conn = DriverManager.getConnection("jdbc:introscope:net//" +
user + ":" + password + "@" + hostname + ":" + port);
String query = "select * from metric_data"
+ " where agent='"
+ agents_filter
+ "' and metric='"
+ metrics_filter
+ "' and timestamp between "
+ queryInterval;
Statement ps=conn.createStatement();
ResultSet rs=ps.executeQuery(query);
rs.setFetchSize(Size);
ResultSetMetaData rsm = rs.getMetaData();
File output = new File("result");
PrintWriter out = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream(output), "UTF-8")), false);
for(int i = 1; i <= rs.getMetaData().getColumnCount(); i++){
String colName = rs.getMetaData().getColumnName(i);
out.print(" " + colName + "\t\t" + "|");
}
while (rs.next()) {
for(int i = 1; i <= rs.getMetaData().getColumnCount(); i++){
String colValue = rs.getString(i);
out.print(" " + colValue + "\t" + "|");
}
out.println();
}
out.close();
out.flush();
rs.close();
ps.close();
conn.close();
当前请求已完全加载到内存中,然后重定向到我的文件。但是一旦请求太重要,我就会收到以下消息:
线程“PO:client_main Mailman 2”中的异常 java.lang.OutOfMemoryError: Java 堆空间 线程“UnknownHub Hub Receive 1”中的异常 java.lang.lang.OutOfMemoryError: Java heap space
我希望能够在文件中写入例如 1000 行乘以 1000 行,以免内存饱和。
知道文件有时会达到 40gb
执行时间不是问题,但内存消耗是一个非常重要的标准。
我远不是一个java专业人士,所以我需要你的帮助。
提前感谢您的宝贵时间
【问题讨论】:
标签: java bufferedwriter