2017-02-10 3 views
1

私はmysqlから読み込み、結果をtxtファイルに書き込もうとしています。ご覧のとおり、私はApacheのCommons IOを使います。結果セットにはつぶやきが含まれており、以下のすべてのSQLクエリはほぼ725行を返してtxtファイルに記録されます。私の問題は書き込み速度です、非常に遅いです(毎秒2-3kb)。私はここに何かを逃していますかFileUtils.write writing speed

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++; 
      } 
     } 

答えて

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(...) 

、その後、ループの後、あなたは、単に1に(あなたはメモリ内で収集という)を全体の内容を書き込むためにFileUtils.write()を使用しますファイルシステムへのシングルショット。

これは、新しいコードの全体的な複雑さを妥当なレベルに維持する必要があります。エンドツーエンドのパフォーマンスが向上します。

+1

_これはあなたに最適なパフォーマンスを与えるものではないことに驚かされますか?_ _ - このコメントはあなたの答えには全く貢献しません。 – OldCurmudgeon

+0

私はJavaでファイル操作を行って以来、長い時間がかかりました。今はnoobの間違いを見ています。しかし、当時はコモンズを使用するのが妥当と思われました。あなたの提案をどのように実装できますか?コモンズでそれを行う方法はありますか?別の方法を使用すべきですか? –

+0

@Aaron Clifton 'File'ではなく' FileOutputStream'を使用し、 'IOUtils.write(fos、content、" UTF8 ");を使用します。 – davidxxx

関連する問題