Java 我必须从数据库中提取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

我必须从数据库中提取500K行并将数据写入文件,这意味着执行I/O操作。我已经做了两个步骤

  • 将每一行逐个写入文件
  • 创建这些行的块。将这些行附加到StringBuffer中,然后打印它。这一个会更好,但是有没有任何方法可以让文件I/O在不使用StringBuffer的情况下自行生成缓冲区。由于此字符串缓冲区占用更多时间(内部使用Arrays.copyOf)
  • 请就此向我提出建议 请查找随附的代码

    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吗