打印数百万行/JAVA堆空间
我正在处理一些数据库,我需要在文件中打印每个数据库。 我的服务器有5GB的RAM,我只为tomcat服务器分配了4GB 我制作了一个简单的结果集,它可以查询每个数据库的所有行。 然后我打印文件(.dat)中的每一行(显然,我是单独打印的) 我可以处理包含5738095行的整个结果集 但是如果我想处理一个超过700万行的数据库,我得到了错误“Java堆空间”,我已经开始为tomcat使用3GB和2GB,但是当我开始处理超过300万行时,我需要向服务器添加更多RAM,所以我的问题是,在我的服务器上放更多的RAM好吗?或者我如何划分结果集并以百万分之一的速度打印,而不会得到错误“java堆空间” 我一直在考虑对整个数据库进行计数,并做出一些类似于限制0偏移1000000,限制1000000偏移1000001的东西,但我真的迷路了。谢谢你的阅读和帮助,对不起我的英语 有一些密码打印数百万行/JAVA堆空间,java,jdbc,Java,Jdbc,我正在处理一些数据库,我需要在文件中打印每个数据库。 我的服务器有5GB的RAM,我只为tomcat服务器分配了4GB 我制作了一个简单的结果集,它可以查询每个数据库的所有行。 然后我打印文件(.dat)中的每一行(显然,我是单独打印的) 我可以处理包含5738095行的整个结果集 但是如果我想处理一个超过700万行的数据库,我得到了错误“Java堆空间”,我已经开始为tomcat使用3GB和2GB,但是当我开始处理超过300万行时,我需要向服务器添加更多RAM,所以我的问题是,在我的服务器上放
//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();
//numero columns是列的总数
rs_datos=StDatos.executeQuery(“从表中选择*);
while(rs_datos.next())
{
对于(int i=0;i
在当前设置中,检查实际有多少行调用SQL查询时从数据库加载。见: 如果JDBC驱动程序支持延迟加载,那么应该尝试使用它 另见: 我的意思是,你打算用
限制和偏移量,
JDBC驱动程序已经可以为您完成 您不必将所有行读入RAM来打印它们。连接到DB,执行select并逐行打印,同时迭代结果集。百万行算不了什么,相信我
显然,您也可以使用分页,但在您的情况下,您甚至可能不需要它
最后一点。我真的不明白你为什么要自己实现这种DB导出。所有数据库都有这样的实用程序可以使用。例如,MySQL的mysqldump
。只需找到这样的实用程序,它可以与您的数据库一起工作,并组成正确的命令行参数 如果需要备份特定的表,只需从命令行执行mysqldump:
mysqldump -u... -p... mydb mytable > my_backup.sql
很可能您的程序效率不高,因此一个简单的解决方法是使用此方法。您可以从应用程序或cron执行命令,并使用此命令以csv格式创建文档
给我点数,朋友
mysqldump-u username-p db_name table 1_name>dump.sql应该与内存大小无关。一个正确编写的循环,简单地将一些DB结果导入到一个文件中,不应该占用4gig的ram,除非您处理的是一些巨大的blob记录。您使用的是哪个数据库?mysql/JSP+JDBC。我做了选择,然后当我有了整个结果集时,我将其打印到文件中。我不知道如何“正确地”将所有结果集计入RAM,但谢谢,我将搜索其他实用程序来完成我的工作。@zickno,您尚未显示代码,因此很难帮助您。展示你的代码片段,我们可能会给你一个更好的建议。