打印数百万行/JAVA 堆 space

printing millions of rows / JAVA heap space

我正在处理一些数据库,我需要在文件中打印每个数据库。 我的服务器有 5 GB 的 RAM,我只为 tomcat 服务器分配了 4GB。

我制作了一个简单的结果集,用于查询每个数据库的所有行。 然后我将每一行打印在一个文件 (.dat) 中(显然我是单独做的)

我可以处理包含 5738095 行的整个结果集

但是如果我想使用超过 700 万行的数据库,我会收到错误 "Java heap space",我已经开始为 tomcat 使用 3GB 和 2GB,但是当我开始工作时有超过 300 万行,我需要向我的服务器添加更多 RAM,所以我的问题是,向我的服务器添加更多 RAM 是否好,或者我如何划分结果集并打印百万分之一而不会出现错误“java 堆 space”。

我一直在考虑对整个数据库进行计数,并制作类似 limit 0 offset 1000000、limit 1000000 offset 1000001 之类的东西,但我真的迷路了。感谢阅读和帮助,对不起我的英语。

有一些代码

//numero columnas is the total of columns
 rs_datos =  StDatos.executeQuery("select * from table");
  while(rs_datos.next())
  {

    for(int i = 0; i < numeroColumnas; i++)
    {
      if(i+1 == numeroColumnas)
      {
       pw.print(rs_datos.getString(i+1));
      }
      else
      pw.print(rs_datos.getString(i+1) + "|");
    }

     pw.println("");
  }

  pw.close();

在您当前的设置中,检查实际有多少行
当您调用 SQL 查询时从数据库加载。参见:

Statement.setFetchSize

如果您的 JDBC 驱动程序支持延迟加载,您应该尝试使用它。

另请参阅:

Java JDBC Lazy-Loaded ResultSet

所以我的意思是,您打算用 LIMITOFFSET
做什么 JDBC 驱动程序已经可以为您完成。

您不必将所有行读入 RAM 即可打印。连接到数据库,执行 select 并在迭代结果集时逐行打印。百万行算不了什么,相信我。

您显然也可以使用分页,但在您的情况下您甚至可能不需要它。

还有最后一点。我真的不明白你为什么要自己实现这种数据库导出。所有数据库都有这样的实用程序随时可用。例如 mysqldump 对应 MySQL。只需找到适用于您的数据库的实用程序并编写正确的命令行参数即可。

如果您需要备份特定的 table,只需从命令行执行 mysqldump:

mysqldump -u... -p... mydb mytable > my_backup.sql

很可能您的程序效率不高,因此一个简单的解决方法是使用此方法。

您可以从应用程序或 cron 执行命令,并使用它来创建 csv 格式的文档 Mysqldump in CSV format

朋友,给我积分。

mysqldump -u 用户名 -p db_name table1_name > dump.sql