FileUtils.write写入速度

时间:2017-02-10 12:33:32

标签: java mysql apache performance apache-commons-io

我试图从mysql读取并将结果写入txt文件。如您所见,我使用Apache的Commons IO。结果集包含推文,下面的每个sql查询几乎返回725行,写入txt文件。我的问题是写入速度,它非常慢(每秒2-3 kb)。我在这里错过了什么吗?

Statement stmt2 = connection.createStatement();
        for (int week = 0 ; week<hashTag.length/15 ; week++){

            File container = new File("C:\\Users\\COMP\\Desktop\\threeMonthsSplitTxt\\weeklyBinsTwitter\\week"+week+"-"+hashTag[week]+".txt");

            for(int hash = 0 ; hash<15 ; hash++){
                ResultSet results = stmt2.executeQuery("select tweetContent
                    from threemonthswithhashtag
                    where hashTag = '"+hashTag[hashCount]+"'
                      and tweetCreatedTime between '"+firstDate[hashCount]+"'
                                               and '"+ lastDate[hashCount]+"';");

                while(results.next()){
                    tweetContent = results.getString("tweetContent");
                    try{
                        FileUtils.write(container,newLine,"UTF8",true);
                        FileUtils.write(container,tweetContent,"UTF8",true);
                    }catch(IOException e){e.getMessage();}
                }
                hashCount++;
            }
        }

1 个答案:

答案 0 :(得分:4)

您正在使用API​​为每次写入操作创建/打开/关闭文件(句柄)。

你会惊讶地发现这并没有给你带来最佳表现吗?!

这种实用方法可能很方便,但是,而不是去

loop:
  try:
    open file; write to file; close file
    open file; write to file; close file

考虑按照

的方式做一些事情
open file
loop:
  try:
    write to open file
    write to open file
close file

代替。当然,这意味着您必须编写更多代码;使事情变得更复杂;但是:有时必须平衡“超级易读”代码和“足够好”的代码。

可能最重要的工作甚至可能是:

StringBuilder toWrite = ...
loop:
  try:
  toWrite.append(...)
  toWrite.append(...)

然后,在循环之后,您使用FileUtils.write()来简单地将整个内容(您在内存中收集的内容)一次单次写入文件系统。

这应该将新代码的整体复杂性保持在合理的水平;但有助于提高端到端的性能。