Javaを使用したCSVファイルの生成


8

プロジェクトでは、Javaプログラムを使用して2時間ごとに大きなCSVファイルを生成する必要があります。

このファイルには約60,000行(1行あたり約120文字)があります。サイズはまだわかりません。

FileWriterを使用してファイルを開き、書き込みを続け、最後にファイルを閉じるため、メモリの問題が発生するかどうかを知りたいです。

ファイルのサイズを気にする必要がありますか?はいの場合、FileWriterを使用する以外に、Javaで大きなファイルに書き込むための優れたテクニックはありますか?

Java 5を使用しています。


どのバージョンのJavaを使用していますか?
Martijn Verburg

よ... Nesという意味です。ダムニット、レンメは私の魔法の8ボールを取得します。
2012

速度が重要な場合は、非常に大きな(数メガバイト)バッファーを試してください。それは......、あなたの結果は変更になる場合があります。もちろん、10倍に私のファイルの書き込みを高速化
RalphChapin

回答:


14

いいえ、すべきではありません。ファイルのポイントは、ランダムアクセスメモリの外に物を格納することです。FileWriterのサイズは一定であり、かなり小さい可能性が高いため、たとえそれがバッファー付きFileWriterであっても、すべてを考慮する必要があります。常に書き換えを行うと、I / O負荷やCPUスパイクが発生する可能性がありますが、メモリ不足はほとんどありません。


ファイルライターを閉じるまで、ファイルデータはメモリに保持されると思いましたか?私の仮定は間違っているようです。
java_mouse

8
いいえ、BufferedFileWriterは特定の量のデータをメモリに保持しますが、その量は、呼び出された環境に応じて固定された量になります。プッシュされたバイト数に制限されずに増加することはありません。災害のレシピ!
キリアンフォス

8

Killian Fothが書いたように、何の問題もないはずです。60000行はそれほど大きくありません。独自の実装を作成する代わりに、http://commons.apache.org/csv/の「Commons CSV」イニシアチブでここに提供されている無料のCSVパーサーのいずれかを使用することをお勧めします 。

いくつかのプロジェクトでSuper CSVを使用しましたが、問題はありませんでした。


1
私はopenCSVを使用しました。私はそれが好きです。60K行は何もありません。私の古いラップトップはすぐにそれを処理します。
ahoffer

Jalaynを聞いてよかった!大量のバグ修正、新機能、まったく新しいWebサイトを備えたSuper CSVの新バージョンをリリースしました。ああ、それは現在Mavenセントラルにあります:)
James Bassett

5

FileWriterは使用しないでください。パフォーマンスの懸念のため(JavaのIOクラスはすべてをメモリに保持しないため、60k行はそうであっても何もありません)ではなく、文字エンコーディングを選択できないためです。暗黙的にプラットフォームのデフォルトのエンコーディングを使用します。つまり、ASCII以外のテキストが破損する可能性があります。

代わりに、FileOutputStreamをラップするOutputStreamWriterを使用してください。または、さらに良いことに、これらすべての問題を処理するCSVライブラリー。


または、OutputStreamWriterの代わりに、NIOクラス(ByteBuffersを含むFileChannel)を使用しますか?すべてのCSVライブラリがエンコードを処理しますか?私はSuperCSVをざっと見ましたが、エンコーディングの処理については何もわかりませんでした。
Sam Goldberg

1
@Sam Goldberg:そうです、リーダー/ライターで動作し、その懸念を発信者に任せているようです。
Michael Borgwardt、

それは、リーダ/ライタを供給するのはあなた次第ですので、スーパーCSVは、IoCのを使用して書かれていた- -あなたにしている右@MichaelBorgwardtファイルに書き込むことができ、そのように、zipファイル、HTTPレスポンスなどを私達はちょうどリリースした新しいをバージョン -ぜひチェックしてみてください:)ああ、そして文字エンコーディングに関しては、Unicodeに関する Joel Spolskyの記事が優れていることにいつも気づきました。
James Bassett

1

BufferedWriterの使用を検討することもできますが、これはおそらくパフォーマンスにはあまり役立ちませんが、行数は常に60,000になるとは限らないので、いずれの場合もベストプラクティスです。

後でファイルを圧縮することを検討しましたか?これらのファイルを大量に配置する予定がある場合は、書き込み後に圧縮することをお勧めします。特に、数時間ごとにこれらのファイルを作成する場合は、

メモリに関しては、メモリが非常に少ないシステムで作業しているのでない限り、おそらく心配する必要はありません。その場合、BufferedWriterを使用して、バッファサイズを明示的に設定する必要があります。


1
BufferedFileWriterとは何ですか?
Michael Borgwardt

おっとっと。私はBufferedWriterを意味しました。修繕。
Neil
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.