2009-08-27 8 views
0

FileOutputStream/BufferedOutputStreamを使用して100個のファイルを作成しようとしています。 CPU使用率が5〜10秒間100%であることがわかります。私が書いているディレクトリは空です。私はiTextを介してPDFファイルを作成しています。各ファイルは1 MBのラウンドを持つ。私はLinux上で動作しています。Java I/Oがより多くのCPUリソースを消費します

私はCPU使用率を最小限に抑えるためにコードを書き換えることができますか?

+0

私はそれがOSそのものの設計にあると思います。 ubuntuではこれを行うことはできません.Windowsでは、これはNTFSの設計とファイルにアクセスするウィンドウのメカニズムのために一般的な状況です。 Windows XPは1つのユーザーOSに合わせて作られており、ユーザーが「XXXファイルを一度に開くとどうなるでしょうか?私は今Windows 7で改善されていると思う。 –

答えて

4

これは既に多数のファイルを含むディレクトリにありますか?そうであれば、ディレクトリにたくさんのファイルを置いた場合のペナルティが表示されます。これは、オペレーティングシステムとファイルシステムによって大きく異なります。

それ以外の場合は、ファイルを作成するときに実際に何をしていますか?データはどこから来たのですか?彼らは大きなファイルですか?あなたがしたいかもしれないことの1つは、代わりにByteArrayOutputStreamに書き込んでみてください。つまり、ファイルシステムに起因するアクティビティの量と、データの取得/書き込みの方法がわかります。

+0

私が書いているディレクトリは空です。私はiTextを介してPDFファイルを作成しています。各ファイルは1 MBのラウンドを持つ。 私はLinuxで動作しています。そして、私はByteArrayOutputStreamを使ってたくさんの違いを発見しました – Niger

0

特にWindowsシステムでは、タスクのCPU負荷を軽減することはできません。 LinuxのJavaは非同期ファイル入出力をサポートしていますが、これはコードを深刻に複雑にする可能性があります。私はあなたがWindows上で動作しているのではないかと考えています.File I/Oは一般にLinuxよりもWindows上で時間がかかります。私はWindows上のLinux VMでJavaを実行することで改善について聞いたことがあります。

プロセスが実行されているときにタスクマネージャを見て、カーネルタイムを表示をオンにします。ユーザー空間で費やされるCPU時間は一般的には最適化できますが、カーネル空間のCPU時間は通常、より効率的な呼び出しを行うことによってのみ減らすことができます。

  • 更新 - 具体的に収集/ファイルIO非同期、多重化、散布のための必要性に対処

JSR 203:JSR-51によって導入された多重化非ブロッキング機能はあまり解決

ファイルシステムの操作ではそうしていませんでした。

JSR-203がJavaの一部になるまで、Linux上でApache MINAプロジェクトで真の非同期IOを取得できます。

Java NIO(1)を使用すると、チャネルベースのI/Oを実行できます。これはパフォーマンスの向上ですが、一度にデータのバッファを実行するだけで、真の非同期ではありません&多重化されたIO。

+0

Stu、http://java.sun.com/j2se/1.5.0/docs/api/java/nio/channels/FileChannel.html仕様でどこかを見せてください非同期IOについて私は、JavaがWindows上でDMAを実行できないとは言いませんでした。それはまったく別のことです。 – brianegge

2

これは長時間の推測ですが、バッファリングされたストリームを使用している場合でも、一度に1バイトずつ書き込まないようにしてください。

.read(int)およびはCPUキラーです。特定の場合は、.read(byte[]...).write(byte[], int, int)を使用する必要があります。

8

あなたのアプリケーションをプロファイルしないでください。

数値が、書き込み呼び出しで/時間内に多くの時間が費やされていることを示している場合は、高速I/Oを行う方法を見てください。しかし、出力用の書式設定(例:iTextレンダリング)に多くの時間が費やされている場合は、それがあなたの努力に集中する必要があります。

+2

+1 - 問題が何かを推測する前にプロフィール。 –

0

書き込み対象の1MBファイルは、java.nio FileChannelを使用し、java.ioよりも大幅にパフォーマンスが向上します。あなたのコードを書き直して、それを古いものに変更してください。私は最低でも2倍の改善を予測します。

関連する問題