web-dev-qa-db-ja.com

InputStream.read()に使用するbyte []サイズをどのように決定しますか?

InputStreamsから読み取る場合、byte []に​​使用するサイズをどのように決定しますか?

int nRead;
byte[] data = new byte[16384]; // <-- this number is the one I'm wondering about

while ((nRead = is.read(data, 0, data.length)) != -1) {
  ...do something..
}

小さいものと大きいものをいつ使用しますか?違いは何ですか?数は1024の増分になりたいですか?それがネットワークとディスクからのInputStreamである場合、違いはありますか?

どうもありがとう、私は他の場所で明確な答えを見つけることができないようです。

33
cottonBallPaws

ほとんどの人はサイズに2の累乗を使用します。バッファが512バイト以上の場合、大きな違いはありません(<20%)

ネットワークの場合、最適なサイズは2 KB〜8 KBです(基になるパケットサイズは通常、最大1.5 KBです)。ディスクアクセスの場合、最速のサイズは8K〜64KBです。 8Kまたは16Kを使用する場合、問題はありません。

ネットワークのダウンロードについては、通常、バッファ全体を使用しないことに気付く可能性があります。 99%のユースケースでは、数KBを無駄にすることはそれほど重要ではありません。

22
Peter Lawrey

それは主にあなたが持っているメモリの量とあなたが読むことを期待するデータの量に依存します。あまり頻繁にブロックしたくないので、BenColeの答えを検討してください。一方、処理が実際の読み取りよりも遅い場合は、データの小さなチャンクを処理する必要はありません。

私は個人的にライブラリを使用して、バッファサイズを選択するタスクをライブラリの作成者に任せようとしています。その後、私は気が狂うので、ライブラリコードを絶対に読まないことを約束します。

3
alf

そのような状況では、私は常に2Kから16Kの範囲のどこかで2の妥当な電力を使用します。一般に、InputStreamが異なれば最適値も異なりますが、値を決定する簡単な方法はありません。

最適な値を決定するには、処理しているInputStreamの正確なタイプ、およびInputStreamにサービスを提供しているハードウェアの仕様などについて詳しく理解する必要があります。

これを心配するのは、おそらく時期尚早の最適化の場合です。

3
JohnnyO

InputStream クラスでavailable()メソッドを使用する。 Javadocから:

この入力ストリームのメソッドの次の呼び出し元によってブロックされることなく、この入力ストリームから読み取る(またはスキップする)ことができるバイト数を返します。次の呼び出し元は、同じスレッドまたは別のスレッドである可能性があります。

1
BenCole