gpt4 book ai didi

java - 以最小内存消耗写入文件的设计模式

转载 作者:行者123 更新时间:2023-11-30 03:35:22 27 4
gpt4 key购买 nike

我需要通过读取 xml 来编写一个文件,其中包含格式信息和要从数据库获取的值。我正在处理大量记录(200,000)。我尝试将所有数据保留在内存中,但出现内存不足错误。我尝试一次又一次地访问数据库,但后来遇到了性能问题。当查询一次又一次被点击时,性能会降低。

该过程涉及的步骤:

  1. 点击 db 获取要创建文件的所有记录
  2. 使用 Jaxb 读取 xml 文件
  3. 创建从第 1 步获得的所有数据的 map 。
  4. 迭代从步骤 1 获得的 map
  5. 从创建的格式对象中获取需要显示的数据在步骤 2 中
  6. 将结果附加到每个记录的字符串中,然后写入相同的结果进入文件

不过,最终我通过读取一次预定义的数据计数并为此写入文件,然后处理下一组数据来解决了这个问题。但我没有遵循任何设计模式。

是否有一种设计模式可以使用最少的内存并让我高效地写入文件?

最佳答案

该设计模式名为 Pagination (使用光标)。例如,当您向 Oracle DB 发送查询时,返回结果集中的默认结果数为 50。只有当您要求结果集获取 next() 时,它才会返回接下来的 50 个结果。这就是大多数数据库的工作方式,并被设计为对这种模式有效(请参阅此 code example ):

public static void viewTable(Connection con, String dbName)
throws SQLException {

Statement stmt = null;
String query =
"select COF_NAME, SUP_ID, PRICE, " +
"SALES, TOTAL " +
"from " + dbName + ".COFFEES";

try {
stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
String coffeeName = rs.getString("COF_NAME");
int supplierID = rs.getInt("SUP_ID");
float price = rs.getFloat("PRICE");
int sales = rs.getInt("SALES");
int total = rs.getInt("TOTAL");
System.out.println(coffeeName + "\t" + supplierID +
"\t" + price + "\t" + sales +
"\t" + total);
}
} catch (SQLException e ) {
JDBCTutorialUtilities.printSQLException(e);
} finally {
if (stmt != null) { stmt.close(); }
}
}

因此,您可以打开该文件,并写入您获得的结果的每一“页”,请求下一页等。完成后 - 关闭该文件。

关于java - 以最小内存消耗写入文件的设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28053644/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com