ジャバ:大きなファイルを書き込んでいますか?
-
19-09-2019 - |
質問
ご挨拶、データベースから膨大な数のレコードを取得し、ファイルに書き込みます。巨大なファイルを書く最良の方法は何だと思っていました。(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を使用してみてください。