2011-09-27 9 views
7

こんにちは私は大量のCSVファイルを作成する必要があります。私はそれを効率的に行う方法が不思議だったので、私の心の中で質問が少なくなります。大きなCSVファイルを作成するためのJava IOのベストプラクティス

1。 BufferedWriterを使用してファイルを書き込むとき、どのくらいの頻度でフラッシュする必要がありますか?しかし、私は、バッファリングされたWriterが独自のバッファを保持していると思います。バッファが一杯になると自動的にフラッシュされます。

  1. 作成するファイルが大きくなるため、だから、ファイルを書き始めたら、ファイルは自動的にディスクにコミットされますか? (writer.close()を呼び出す前に)、またはライターを閉じるまで、ファイル全体がメインメモリに残ります。それはGCの準備ができている。すなわち、私はすでに書かれた部分のどの部分がメインメモリにされていないことを意味コミットすることにより

+0

データはどこから来ますか?ネットワーク上またはメモリ内の別のディスクベースのストレージ? – claymore1977

+0

データがDBから取得され、ビジネス検証がほとんどなく、これらのファイルを処理する必要があります – dpsdce

答えて

4
  1. BufferedWriterの実装は、必要に応じてフラッシングを実行する必要があります。あなたの場合は、flushに電話する必要はありません。

    なぜflushメソッドがあるのか​​は、BufferedWriterのバッファがいっぱいになるのを待つのではなく、すぐに出力を書き込むことが望ましいためです。 BufferedWriterはファイル用ではありません。コンソールやソケットへの書き込みにも使用できます。たとえば、ネットワーク経由でデータを送信したいが、十分なデータがない場合は、BufferedWriterを自動的にフラッシュすることができます。このデータをすぐに送信するには、flushを使用します。

  2. BufferedWriterに書き込んだすべてのデータは、同時にすべてのメモリに残りません。これは、BufferedWriterのバッファーがいっぱいになると(フラッシュされた)断片で書き出されます。最後にcloseを呼び出すと、BufferedWriterは、バッファに残っているすべてのものについてもう一度最後のフラッシュを行い、ディスクにまだ書き込まれていないファイルを閉じます。

0

私の傾斜は、後にディスクにフラッシュする、セグメントで動作するようになります1kまたは2kラインごとに。そのような多くのデータでは、メモリの制限を押しているように見えます。この操作はすでに遅い可能性が高いため、安全面で失敗し、頻繁にディスクに書き込む。とにかく私の$ 0.02です:)あなたはBufferedWriterの中にあなたのライターをラップする場合

3

が、あなたはディスクが起こるまでのバイト数は、物理的な書き込み前にメモリに保存されるように指定

。 (あなたが指定しなければ、既定値がありますが、それは8kだと思いますが、それを福音として引用しないでください)

PrintWriterを使用すると、各行でディスクに書き込むと思います。

他のライターは、各I/Oコールでディスクに書き込みます。バッファリングはありません。これは通常、吸い付きのパフォーマンスにつながります。そのため、すべてのディスクライターをBufferedWriterにラップする必要があります。

0

BufferedWriterは固定サイズのバッファを使用し、バッファがいっぱいになると自動的にフラッシュします。したがって、大きなファイルはすべてチャンクで書き込まれます。

バッファが一杯になる前に何かをディスクに書きたい場合があるので、flushメソッドが存在します。典型的な例は、SocketOutputStreamをラップするBufferedWriterです。

バッファがいっぱいになるまで要求が送信されないため、スレッドは無期限にブロックされる可能性があります。したがって、次のようにしてください:

writer.write(request); 
writer.flush(); // make sure the request is sent now 
reader.read(response); 

関連する問題