2009-05-28 30 views
3

多くのギガバイトのテキストデータを処理していますが、パフォーマンスを向上させる方法があるかどうかは疑問でした。たとえば、10ギガバイトのデータを処理していないときに、1行ずつ繰り返し処理する場合は、約3分かかります。BufferedReaderの速度を向上させる

基本的に私はBufferedReaderを含むdataIteratorラッパーを持っています。私はこのイテレータを続けて呼び出し、次の行を返します。

文字列の数が問題になっていますか?または、おそらく関数呼び出しの数。私はjarとしてコンパイルされ、STAFサービスとして使用されるため、このアプリケーションのプロファイル方法を実際には分かりません。

すべてのアイデアは高く評価されていますか?

答えて

6

アプリケーションはI/Oバインドです。オブジェクトの割り当て、メモリ、またはCPUの制限により、パフォーマンスが低下することはありません。ディスクアクセスのため、アプリケーションの実行速度が遅いです。

ファイルアクセスを改善できると思われる場合は、JNIを使​​用して下位レベルのプログラミングに頼る必要があります。ファイルアクセスは、自分でより効率的に処理し、より低いレベルで実行する必要がある場合に改善することができます。

java.nioを使用すると、探しているパフォーマンスが向上することは確かですが、I/Oの実行中にCPU /メモリーを大量に使用する操作を自由にすることができます。なぜなら、基本的には、java.nioは、ファイルの読み込みをセレクタでラップして、バッファが読み込まれたときに通知を受け、実際にあなたのパフォーマンスを少し助けるかもしれない非同期の動作を与えているからです。しかしファイル自体を読むとがボトルネックになり、java.nioはその領域に何も与えません。

まず最初に試してみてください

+3

真実。 3分で10GBは55MB /秒です。これは、プラッタベースのディスクドライブの従来の読み取りパフォーマンスに近づいています。あなたは本当に良い状況でそれを2倍または3倍にするかもしれませんが、RAMベースのドライブがなければ、それだけです。 – Jherico

+0

Jherico>または「インデックスを追加する」または同様のものです。 –

+0

私は従いません。 IOバインディングを使用している場合、どのように索引を作成すると役立ちますか?アプリケーションの検索のようには聞こえません。ログ処理やインデックス作成のように、データを順番に処理しているようです。 – Jherico

3

私はJava's NIO packageがあなたのニーズに非常に役立つと思います。

This Wikipedia articleには、「古い」Java I/Oに特有の改良点についての素晴らしい情報があります。

+0

これを試してみます。 – esiegel

+0

NIOを使用しているかどうかわからないと、読み取りパフォーマンスそのものに役立ちます。ファイルをマッピングすることで読み込むと、*間接的に*役立つかもしれません - OSファイルキャッシュを踏みにじるのを読書が止めるべきです。 –

0

プログラムが通常の「java -options ... ClassName args ...」コマンドラインから起動された場合は、プロファイルすることができます。私はNetBeans Profilerをよく知っています。それは別にJavaアプリケーション(adding a java option to the startup)を起動してからプロファイラをアタッチする方法を持っています。

改善が必要なものを測定せずに最適化しようとすると、暗闇の中で作業しています。あなたはラッキーになるかもしれないし、無関係な仕事をするのに多くの時間を費やすかもしれません。

+0

STAFサービスをJARにコンパイルし、STAFを呼び出してjarファイルを組み込みます。私はJconsoleで見てみましたが、何らかの理由で接続できませんでした。私はこの質問をSTAFフォーラム自体に掲載しましたが、あまり役に立ちませんでした。 – esiegel

1

NIO、チャネル、バイトバッファ、およびメモリマップファイルを使用すると、最高のパフォーマンスが得られます。ハードウェアとほぼ同じです。私は6百万の区切られたテキスト行(265MBファイル)を解析して、区切られた列の周りを移動してからそれを書き戻さなければならない同様の問題を抱えていました。 NIOと2002のハードウェアを使って、これを行うのに33秒かかりました。トリックは、データをバイトのままにすることです。あなたは、行を抽出するためにデータを読み取る1つのスレッドと、行を操作する別のスレッドと、それを書き戻すための3つ目のスレッドがあります。

関連する問題