Java 我必须从数据库中提取500K行并将数据写入文件,这意味着执行I/O操作
我必须从数据库中提取500K行并将数据写入文件,这意味着执行I/O操作。我已经做了两个步骤Java 我必须从数据库中提取500K行并将数据写入文件,这意味着执行I/O操作,java,performance,file-io,Java,Performance,File Io,我必须从数据库中提取500K行并将数据写入文件,这意味着执行I/O操作。我已经做了两个步骤 将每一行逐个写入文件 创建这些行的块。将这些行附加到StringBuffer中,然后打印它。这一个会更好,但是有没有任何方法可以让文件I/O在不使用StringBuffer的情况下自行生成缓冲区。由于此字符串缓冲区占用更多时间(内部使用Arrays.copyOf) 请就此向我提出建议 请查找随附的代码 public void fetchDataWithChunkSpace(Connection con)t
public void fetchDataWithChunkSpace(Connection con)throws Exception
{
String query ="select * from lis.testxml ";
long startTime=new Date().getMinutes();
PreparedStatement stmt = con.prepareStatement(query);
ResultSet rs = stmt.executeQuery();
PrintWriter pw = new PrintWriter(new File("c:\\test_chunkSpace.xml"));
pw.write("<?xml version='1.0' encoding='UTF-8'?>");
StringBuffer sb = new StringBuffer();
String t=null;
long count =0;
while(rs.next())
{ count++;
t = rs.getString("xmltest");
sb = sb.append(t);
if(count%100==0)
{
pw.write(sb.toString());
sb = new StringBuffer();
System.out.println(count);
}
}
pw.write("\n");
pw.write("</EndTag>");
pw.close();
stmt.close();
con.close();
long endTime=new Date().getMinutes();
System.out.println("chunkSpace ---> " + (endTime-startTime));
}
public void fetchDataWithChunkSpace(连接con)引发异常
{
String query=“select*from lis.testxml”;
long startTime=new Date().getMinutes();
PreparedStatement stmt=con.prepareStatement(查询);
ResultSet rs=stmt.executeQuery();
PrintWriter pw=新的PrintWriter(新文件(“c:\\test\u chunkSpace.xml”);
请写(“”);
StringBuffer sb=新的StringBuffer();
字符串t=null;
长计数=0;
while(rs.next())
{count++;
t=rs.getString(“xmltest”);
sb=sb.追加(t);
如果(计数%100==0)
{
写(某人写的东西);
sb=新的StringBuffer();
系统输出打印项次(计数);
}
}
pw.写入(“\n”);
请写(“”);
关闭();
stmt.close();
con.close();
long-endTime=新日期().getMinutes();
System.out.println(“chunkSpace-->”+(endTime startTime));
}
查看或
也认为StringBuffer与StringBuilder不同的同步化方法是线程安全类。
更新。 请尝试以下代码:Writer pw = new BufferedWriter(new PrintWriter(new File("c:\\test_chunkSpace.xml")));
pw.write("<?xml version='1.0' encoding='UTF-8'?>");
String t;
while (rs.next()) {
t = rs.getString("xmltest");
pw.write(t);
}
Writer pw=new BufferedWriter(new PrintWriter(新文件(“c:\\test\u chunkSpace.xml”));
请写(“”);
字符串t;
while(rs.next()){
t=rs.getString(“xmltest”);
pw.写入(t);
}
查看或
也认为StringBuffer与StringBuilder不同的同步化方法是线程安全类。
更新。 请尝试以下代码:Writer pw = new BufferedWriter(new PrintWriter(new File("c:\\test_chunkSpace.xml")));
pw.write("<?xml version='1.0' encoding='UTF-8'?>");
String t;
while (rs.next()) {
t = rs.getString("xmltest");
pw.write(t);
}
Writer pw=new BufferedWriter(new PrintWriter(新文件(“c:\\test\u chunkSpace.xml”));
请写(“”);
字符串t;
while(rs.next()){
t=rs.getString(“xmltest”);
pw.写入(t);
}
必须使用XML库来生成XML。否则,您将无法生成有效的XML,这将是您的错。您应该最大限度地利用输出缓冲来加快编写过程,但是我同意其他海报的说法,即您很可能是数据库中的输入绑定,而不是有很大的余地来改进您的实际代码。您必须使用XML库来生成XML。否则,您将无法生成有效的XML,这将是您的错。您应该最大限度地利用输出缓冲来加快编写过程,但是我同意其他海报的说法,即您很可能是数据库中的输入绑定,而不是有很大的余地来改进您的实际代码。那么您的问题是什么?您的问题是什么?请显示如何写入文件的代码。文件I/O通常在缓冲模式下完成。也许你应该展示一些代码。您可以直接写入OutputStream,而不是在StringBuffer中进行缓冲,您可以使用StringBuilder,使用预期大小(构造函数中的整数参数)初始化缓冲区/生成器。。。有几种选择。你到底有什么问题,是不是太慢了?最像是从数据库中读取数据是你的瓶颈。如何将数据写入文件不太重要。根据驱动器的速度,您应该能够将高达90 MB/s的文本写入文件。顺便说一句,我会使用StringBuffer的Javadoc中建议的StringBuilder。为什么它不缩进?在你的编辑器中是这种形式吗?或者是因为你不能费心以一种可解读的形式呈现它?那么你的问题是什么?您的问题是什么?请显示如何写入文件的代码。文件I/O通常在缓冲模式下完成。也许你应该展示一些代码。您可以直接写入OutputStream,而不是在StringBuffer中进行缓冲,您可以使用StringBuilder,使用预期大小(构造函数中的整数参数)初始化缓冲区/生成器。。。有几种选择。你到底有什么问题,是不是太慢了?最像是从数据库中读取数据是你的瓶颈。如何将数据写入文件不太重要。根据驱动器的速度,您应该能够将高达90 MB/s的文本写入文件。顺便说一句,我会使用StringBuffer的Javadoc中建议的StringBuilder。为什么它不缩进?在你的编辑器中是这种形式吗?或者是因为你不想费心把它以一种可解读的形式呈现出来?+1:这就是我会做的,即使解释有点简短@gaurav,你能试着用BufferedWriter代替StringBuffer吗?如果BufferedWriter和StringBuffer可以一起使用,StringBuffer在处理字符串时提供更好的性能和内存使用,虽然BufferedWriter通过在写入文件/文件写入程序期间进行缓冲来改进I/O,例如BufferedWriter提供了StringBuffer的所有优点(但不同步),但使用两者可能只是重复工作。取决于您想要做什么-两者都有append(),但这使BufferedWriter成为StringBuffer的替代品。如果您确信线程安全不是问题,那么可以使用StringBuilder而不是StringBuffer,但老实说,我不知道性能提升会有多大。+1:这就是我要做的,即使解释有点简短。;)@gaurav,你能试着用BufferedWriter代替StringBuffer吗?我们可以用BufferedWriter和StringBuffer吗