質問

ご挨拶、データベースから膨大な数のレコードを取得し、ファイルに書き込みます。巨大なファイルを書く最良の方法は何だと思っていました。(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 には CSV へのエクスポート機能が組み込まれており、これは間違いなく Java で行うよりもはるかに効率的です。どれを使用しているかについては言及しませんでしたが、たとえば MySQL であれば、 LOAD DATA INFILE このために。DB 固有のドキュメントを参照してください。これが新たな洞察をもたらすことを願っています。

他のヒント

BufferedWriterのためのデフォルトのバッファサイズを使用すると、squigabyteファイルを書くことにしようとしている場合、あなたは2引数のコンストラクタを使用して、これを増やすことができます8192です。例えばます。

int buffSize = ... // 1 megabyte or so
BufferedWriter mbrWriter = new BufferedWriter(new FileWriter(memberCSV), buffSize);

このファイルを書き込むために必要なシステムコールの数を減らす必要があります。

しかし、私は、これはパーセント差のカップル以上になるだろうことを疑います。結果セットから行を引っ張ると、おそらく主な性能のボトルネックになります。パフォーマンスの大幅な向上のためには、データベースのネイティブ一括エクスポート機能を使用する必要があると思います。

イム100%確実ではないが、股関節BufferedReaderのは、RAM内のバッファにデータをロードします表示されます。 (特に指定のない限り)Javaは128メガバイトのRAMを使用することができますので、BufferedReaderのは、おそらくオーバーフローJavaのメモリエラーを引き起こします。そして、ただのFileOutputStreamを使用してその文字を書き、読み、文字にデータを格納するためにInputStreamReaderとのFileInputStreamを使用してみてください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top