8

改行文字で区切られた数百万行を含む50Gファイルを読んでいます。現在、ファイルを読み取るために次の構文を使用しています

String line = null;
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("FileName")));
while ((line = br.readLine()) != null)
{
// Processing each line here
// All processing is done in memory. No IO required here.
}

ファイルが大きすぎるため、ファイル全体を処理するのに2時間かかります。ハードディスクからのファイルの読み取りを改善して、IO(読み取り)操作にかかる時間を最小限に抑えることはできますか?私のコードの制限は、各行の順番を処理する必要があることです。

4

6 に答える 6

10

ファイル全体を処理するのに2時間かかります。

50 GB/2時間は約7MB/秒に相当します。それは決して悪い率ではありません。優れた(最新の)ハードディスクは、より高いレートを継続的に維持できる必要があるため、ボトルネックはI /Oではないでしょうか。あなたはすでにBufferedReaderを使用しています。これは、名前が示すように、読み取ったものを(メモリ内で)バッファリングしています。次のように、デフォルトサイズ(8192バイト)よりも少し大きいバッファを使用してリーダーを作成してみることができます。

BufferedReader br = new BufferedReader(
    new InputStreamReader(new FileInputStream("FileName")), 100000);

デフォルトの8192バイトのバッファーと7MB/ sのスループットでは、BufferedReaderは1秒間にほぼ1000回バッファーを再充填するため、その数を減らすと、オーバーヘッドを削減するのに役立ちます。ただし、I / Oの代わりに実行している処理がボトルネックである場合、I/Oのトリックはあまり役に立ちません。マルチスレッドにすることを検討する必要があるかもしれませんが、それが実行可能かどうか、およびその方法は、ここでの「処理」の意味によって異なります。

于 2012-06-24T15:15:45.057 に答える
8

あなたの唯一の望みは、中身の読み取りと処理を並列化することです。あなたの戦略は、ファイルの内容全体が一度にメモリにあることを決して要求しないことであるべきです。

コードのプロファイリングから始めて、時間が費やされている場所を確認する必要があります。最も時間がかかる部分を書き直し、プロファイルを再作成して、改善されたかどうかを確認します。許容できる結果が得られるまで繰り返します。

Hadoopと分散ソリューションについて考えます。現在、自分のデータセットよりも大きいデータセットが日常的に処理されています。あなたはあなたの思考においてもう少し創造的である必要があるかもしれません。

于 2012-06-24T15:08:17.540 に答える
5

NIO がなければ、スループットの障壁を打ち破ることはできません。たとえば、new Scanner(File)リーダーを直接作成する代わりに使用してみてください。最近、そのソース コードを見てみましたが、NIO のファイル チャネルを使用しています。

しかし、私が最初に提案することはBufferedReader、読み取りだけを行う空のループを実行することです。スループットに注意してください。また、CPU にも注意してください。ループが CPU を使い果たす場合は、IO コードに問題があることは間違いありません。

于 2012-06-24T15:31:17.893 に答える
2
  1. ファイルの読み取り中にディスクの競合を追加するウイルス対策プログラムやその他のプログラムを無効にします。

  2. ディスクを最適化します。

  3. raw ディスク パーティションを作成し、そこからファイルを読み取ります。

  4. SSD からファイルを読み取ります。

  5. 50GB の RAM ディスクを作成し、そこからファイルを読み取ります。

于 2012-06-24T19:56:16.423 に答える
1

解決しようとしている問題を再考することで、最良の結果が得られる可能性があると思います。この 50Gig ファイルをロードするのには明らかに理由があります。保存されたデータを分割し、本当に必要なデータのみを使用するより良い方法がないかどうかを検討してください。

于 2012-06-24T21:24:22.540 に答える
0

ファイルの読み方は問題ありません。高速化する方法はあるかもしれませんが、通常はボトルネックがどこにあるかを理解する必要があります。IO スループットは実際には低いほうにあるため、計算にパフォーマンスの副作用があると考えられます。あまり長くない場合は、プログラム全体を表示できます。

または、ループの内容なしでプログラムを実行し、ファイルを読み取るのにかかる時間を確認することもできます:)

于 2014-04-07T21:07:05.220 に答える