【问题标题】:printing millions of rows / JAVA heap space [duplicate]打印数百万行/ JAVA堆空间[重复]
【发布时间】:2015-03-21 15:50:13
【问题描述】:

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

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

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

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

我一直在考虑计算整个数据库并制作诸如限制 0 偏移 1000000、限制 1000000 偏移 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();

【问题讨论】:

  • 不管你有多少(或少)内存。一个正确编写的循环,只是将一些数据库结果汇集到一个文件中,应该吸收 4gig 的内存,除非你正在处理一些巨大的 blob 记录。
  • 您使用的是哪个数据库?
  • mysql / JSP + JDBC .

标签: java jdbc


【解决方案1】:

您不必将所有行都读入 RAM 来打印它们。连接到数据库,执行您的选择并在迭代结果集时逐行打印。百万行算不了什么,相信我。

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

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

【讨论】:

  • 我做了选择,然后当我将整个结果集打印到文件中时。我不知道如何“正确地”不将所有结果集计入 RAM,但谢谢我会搜索其他实用程序来完成我的工作。
  • @zickno,你没有展示你的代码,所以很难帮助你。显示您的代码片段,我们可能会给您更好的建议。
【解决方案2】:

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

Statement.setFetchSize

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

另见:

Java JDBC Lazy-Loaded ResultSet

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        朋友,给点积分。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-01-21
          • 2017-09-06
          • 1970-01-01
          • 1970-01-01
          • 2019-02-24
          • 1970-01-01
          • 2016-02-17
          相关资源
          最近更新 更多