ご挨拶、データベースから膨大な数のレコードを取得してファイルに書き込みます。巨大なファイルを書き込むための最良の方法は何かと考えていました。(1Gb-10Gb)。
現在、BufferedWriterを使用しています
BufferedWriter mbrWriter=new BufferedWriter(new FileWriter(memberCSV));
while(done){
//do writings
}
mbrWriter.close();
ご挨拶、データベースから膨大な数のレコードを取得してファイルに書き込みます。巨大なファイルを書き込むための最良の方法は何かと考えていました。(1Gb-10Gb)。
現在、BufferedWriterを使用しています
BufferedWriter mbrWriter=new BufferedWriter(new FileWriter(memberCSV));
while(done){
//do writings
}
mbrWriter.close();
これにJavaを使用することを本当に主張する場合、最善の方法は、データが到着したらすぐに書き込むことであり、したがって、最初にすべてのデータResultSet
をJavaのメモリに収集しないことです。それ以外の場合は、Javaで少なくともその量の空きメモリが必要になります。
したがって、例えば
while (resultSet.next()) {
writer.write(resultSet.getString("columnname"));
// ...
}
とは言うものの、ほとんどのまともなDBには、Javaで実行できるよりも間違いなくはるかに効率的なCSVへのエクスポート機能が組み込まれています。どちらを使用しているのかは言及していませんが、たとえばMySQLの場合は、LOAD DATA INFILE
これに使用できたはずです。DB固有のドキュメントを参照してください。これが新しい洞察を与えることを願っています。
BufferedWriterのデフォルトのバッファーサイズは8192です。squigabyteファイルを書き込む場合は、2引数コンストラクターを使用してこれを増やすことをお勧めします。例えば
int buffSize = ... // 1 megabyte or so
BufferedWriter mbrWriter = new BufferedWriter(new FileWriter(memberCSV), buffSize);
これにより、ファイルの書き込みに必要なシステムコールの数を減らすことができます。
しかし、これが2、3パーセント以上の違いを生むとは思えません。結果セットから行を取得することが、パフォーマンスの主なボトルネックになる可能性があります。パフォーマンスを大幅に向上させるには、データベースのネイティブバルクエクスポート機能を使用する必要があります。
100%確実ではありませんが、BufferedReaderがデータをRAMのバッファにロードしているようです。Javaは128mbのRAMを使用できるため(特に指定のない限り)、BufferedReaderはJavaのメモリをオーバーフローしてエラーを引き起こす可能性があります。InputStreamReaderとFileInputStreamを使用してデータを読み取り、charに格納してから、FileOutputStreamを使用してそのcharを書き込みます。