1

フラットファイルに約800万行のデータを書き込むプログラムがあります。現在、プログラムはレコードごとにbufferedwriter.writeを呼び出しており、次の戦略で一括書き込みを計画していました。

  1. データ構造(私は配列を使用)を保持して、特定の数のレコードを保持します。
  2. 配列を使用してファイルに詳細を書き込みます。これがコードスニペットです(配列はレコードを格納する配列の名前であり、しきい値カウントは書き込みプロセスのキックオフです)

    if (array.length==thresholdCount) {
        writeBulk(array);
    }
    
    public void writeBulk(String[] inpArray) {
         for (String line:inpArray) {
              if (line!=null) {
                   try {
                        writer.write(line +"\n"); 
                   } catch (IOException e) {
                        e.printStackTrace();
                   }
              }
         }
    
     }
    

ただし、パフォーマンスの向上はあまり見られません。最適なしきい値カウントを決定する方法があるかどうか知りたいですか?また、コードをさらに調整して、配列内の各要素をn個のレコードの連結として格納し、バルクメソッドを呼び出すことも計画していました。たとえば、長さが5000の配列には、実際には50000レコードが含まれ、配列内の各インデックスには10レコードが含まれます。ただし、そうする前に、専門家の意見が必要です。

4

1 に答える 1

1

ファイルへの書き込みは、ディスクにプッシュされる前に、同様の方法ですでにバッファリングされています(フラッシュしない限り、実際には常に正確にバッファリングされるとは限りません)。したがって、書き込みを事前にバッファリングしても、プロセス全体が高速化されることはありません。注:一部のIOクラスは、各書き込みの後にフラッシュ要求を挿入することにより、即時書き込みを行おうとします。これらの特殊なケースでは、事前バッファリングが役立つ場合がありますが、通常は、手動でバッファリングするのではなく、最初にバッファリングされたバージョンのクラスを使用します。

ファイルの終わり以外の場所に書き込んでいる場合は、ファイルの途中に書き込むときに、ハードディスク上にある既にフラッシュされたエントリの内容をコピーする必要がないため、改善が見られます。

于 2012-08-09T21:28:13.927 に答える