5

バイナリ ファイルをロードしているコードをプロファイリングしていました。ロード時間は約15秒でした。

ロード時間の大半は、バイナリ データをロードするメソッドによるものでした。

DataInputStream を作成するための次のコードがありました。

is = new DataInputStream(
     new GZIPInputStream(
     new FileInputStream("file.bin")));

そして、私はこれを次のように変更しました:

is = new DataInputStream(
     new BufferedInputStream(
     new GZIPInputStream(
     new FileInputStream("file.bin"))));

この小さな変更を行った後、読み込みコードは 15 秒から 4 秒になりました。

しかし、BufferedInputStream には 2 つのコンストラクターがあることがわかりました。もう 1 つのコンストラクターを使用すると、バッファー サイズを明示的に定義できます。

2 つの質問があります。

  1. BufferedInputStream で選択されたサイズはどれくらいですか?それは理想的ですか? そうでない場合、バッファーの最適なサイズを見つけるにはどうすればよいですか? 二分探索を行う簡単なコードを書く必要がありますか?
  2. これは BufferedInputStream を使用できる最良の方法ですか? 私はもともと GZIPInputStream 内にそれを持っていましたが、ごくわずかな利益しかありませんでした。私は、コードが現在行っていることは、ファイル バッファーがいっぱいになる必要があるたびに、GZIP 入力ストリームが通過し、x バイト (x はバッファーのサイズ) をデコードすることであると想定しています。GZIPInputStream を完全に省略するだけの価値はありますか? 絶対に必要というわけではありませんが、使用するとファイル サイズが劇的に減少します。
4

2 に答える 2

8

GZIPInputStream と BufferedInputStream の両方が内部バッファーを使用します。そのため、GZIPInputStream 内で BufferedInputStream を使用しても何のメリットもありません。GZIPInputStream の問題は、それが生成する出力をバッファリングしないことです。したがって、現在のバージョンははるかに高速です。

BufferedInputStream のデフォルトのバッファサイズは 8kb であるため、これを増やしたり減らしたりして、効果があるかどうかを確認できます。正確な数が重要であるとは思えないので、単純に 2 で乗算または除算できます。

ファイルが小さい場合は、完全にバッファリングすることもできます。これにより、理論的には最高のパフォーマンスが得られるはずです。GZIPInputStream のバッファ サイズ (デフォルトでは 512 バイト) を増やすこともできます。これにより、ディスクからの読み取りが高速化される可能性があります。

于 2010-12-14T10:36:02.093 に答える
4
  1. コード化されたバイナリ検索を気にしないでください。いくつかの値を手で試して、タイミングを比較してください (必要に応じて、手動でバイナリ検索を実行できます)。非常に広い範囲のバッファー サイズを使用すると、最適に近いパフォーマンスが得られる可能性が高いため、うまくいく最小のものを選択してください。

  2. あなたが持っているのは正しい順序です:

    is = new DataInputStream(
         new BufferedInputStream(
         new GZIPInputStream(
         new FileInputStream("file.bin"))));
    

    後者はすでにその入力をバッファリングしている (ただし、出力はバッファリングしていない) ため、のBufferedInputStream中に a を入れる意味はほとんどありません。GZIPInputStream

    削除は有利GZIPInputStreamかもしれませんが、データをディスクから読み取る必要があり、ファイルシステム キャッシュに常駐していない場合は、パフォーマンスに悪影響を与える可能性が高くなります。その理由は、ディスクからの読み取りが非常に遅く、解凍gzipが非常に高速であるためです。したがって、ディスクからより多くのデータを読み取るよりも、ディスクからより少ないデータを読み取ってメモリに解凍する方が一般的に安価です。

于 2010-12-14T10:30:50.317 に答える