5

ファイルをメインメモリにロードするにはどうすればよいですか?

を使用してファイルを読み取ります

BufferReader buf = new BufferedReader(FileReader());

これは、ディスクからファイルを1行ずつ読み取っていると思います。これの利点は何ですか?

ファイルをメモリに直接ロードする利点は何ですか? Java でそれを行うにはどうすればよいでしょうか。

ScannerorRandomAccessFileメソッドの例をいくつか見つけました。ファイルをメモリにロードしますか? それらを使用する必要がありますか?2つのうちどちらを使用すればよいですか?

前もって感謝します!!!

4

2 に答える 2

7
BufferReader buf = new BufferedReader(FileReader());

これは、ディスクからファイルを1行ずつ読み取っていると思います。これの利点は何ですか?

ではない正確に。サイズがデフォルトのバッファサイズ(8kバイトだと思います)のチャンクでファイルを読み取っています。

利点は、巨大なファイルを読み取るために巨大なヒープを必要としないことです。最大ヒープ サイズは JVM の起動時 (Hotspot Java を使用) にしか指定できないため、これは重大な問題です。

また、巨大なヒープを表すためにシステムの物理/仮想メモリ リソースを消費することもありません。

ファイルをメモリに直接ロードする利点は何ですか?

これにより、システム コールの数が減り、ファイルの読み取りが速くなる可能性があります。どれだけ速くなるかは、多くの要因によって異なります。そして、非常に大きなファイルを扱うという問題があります。

Java でそれを行うにはどうすればよいでしょうか。

  1. ファイルのサイズを調べます。
  2. 十分な大きさのバイト (または文字) 配列を割り当てます。
  3. 関連するread(byte[], int, int)またはread(char[], int, int)メソッドを使用して、ファイル全体を読み取ります。

メモリ マップト ファイルを使用することもできBufferます。

Scanner または RandomAccessFile メソッドの例をいくつか見つけました。ファイルをメモリにロードしますか?

いいえ、いいえ。

それらを使用する必要がありますか?2つのうちどちらを使用すればよいですか?

必要な機能を提供していますか? テキストベースのデータを読み取り/解析する必要がありますか? バイナリ データに対してランダム アクセスを行う必要がありますか?

通常の状況では、主に必要な機能に基づいて I/O API を選択し、次にパフォーマンスの考慮事項に基づいて I/O API を選択する必要があります。読みながら解析するつもりであれば、通常はBufferedInputStreamorを使用するBufferedReaderだけで許容できるパフォーマンスを得ることができます。(ただし、実際にファイル全体を元の形式でメモリに保持する必要がある場合は、BufferedXxxラッパー クラスを使用すると実際には読み取りが少し遅くなります。)


* -許容できるパフォーマンスは最適なパフォーマンスと同じではないことに注意してください。ただし、クライアント/プロジェクト マネージャーは、最適なパフォーマンスを実現するためにコードを書く時間を無駄にしたくないでしょう...これが規定された要件でない場合。

于 2012-10-27T03:54:10.913 に答える
4

ファイルを読み込んで解析し、最初から最後まで一度歩いてデータを抽出し、ファイルを再度参照しない場合、バッファリングされたリーダーはほぼ「最適」です。バッファ サイズを調整することで、パフォーマンスをいくらか「調整」できます。バッファが大きいほど、ファイルから大きなチャンクが読み取られます。(バッファーを 2 の累乗にします -- 例: 262144。) 大きなファイル全体 (たとえば 1 MB より大きい) を読み取ると、通常、ページングとヒープ管理のパフォーマンスが低下します。

于 2012-10-27T13:16:56.840 に答える