2017-11-14 32 views
0

DBから大量のファイルテキストを書き込もうとしていますが、約2ミリオンの行があります。 私は、PrintWriterが行(println())を印刷している間、ファイルサイズは常に0バイトであることを確認しました。ファイルは、ストリームが閉じられた後のサイズデータを持っています。 これは、すべてのデータが最初にメモリに保存され、ストリームが閉じるときに解放される原因になります。 私の場合、1ミリオンのデータ+ - 2.5GBのメモリが消費された後。アプリのクラッシュ リアルタイムでデータを書き込むことができ、メモリ消費を防ぐことができますか?Java PrintWriterの大きなメモリを消費

これは一例です:

File file = new File("file.txt"); 

    PrintWriter out; 

    out = new PrintWriter(new OutputStreamWriter(new BufferedOutputStream(new FileOutputStream(file)), "UTF-8")); 

for (int i=0; i < 9999999; i++){ 
    out.println("some data here"); 
} 
out.close(); 
+0

https://stackoverflow.com/questions/7753424/whats-the-most-efficient-way-to-write-large-text-file-in-javaを見ましたか? –

+0

なぜPrintWriterの作成が複雑になっていますか?新しいPrintWriter( "file.txt")を使うことができます。そして、あなたの質問に答えるために、すべての 'n'行のflush()を使ってみてください。 – Tharun

答えて

1

あなたは、行の自動フラッシュは行わずPrintWriterを作成しましたので、あなたはflush()close()を呼び出すまで内容はバッファリングされます。あなたはすべての行を(それは遅いです)フラッシュする必要はありませんので、あなたはフラッシュを実行することができ

for (int i=0; i < 9999999; i++){ 
    out.println("some data here"); 
    if(i % N == 0) 
     out.flush(); 
} 

を持つすべてのN行がどのようにパフォーマンスの変化を確認するためにNの異なる値でそれを試してみてください。

+0

こんにちはKayaman、私はout.flush()を使ってみましたが、私のために働いていませんでした。そして、私はあまりにも、コンストラクタを使用してautoflushingを有効にしようとしました:新しいPrintWriter(新しいOutputStreamWriter(新しいBufferedOutputStream(新しいFileOutputStream(ファイル))、 "UTF - 8" – toto

+0

「それは機能していません」とはどういう意味ですか?データがフラッシュされるとファイルサイズが大きくなるのがわかります。 – Kayaman

+0

ファイルサイズは常に0バイトで、メモリは最大2.5GBです。 out.close()が実行されるときだけ、データサイズを持ちます。 – toto

関連する問題