2011-01-26 22 views
1

FileInputStreamread(byte[])を呼び出すと、byte[]が指数関数的に大きくても、読み取りサイズは常に8kです。Java FileInputStreamで使用される内部バッファーサイズを増やす

1回の呼び出しで返される最大読み取り量をどのように増やしますか?

FileInputStreamの制限を単にマスクする方法を提案しないでください。


更新:これに対する真の解決策があるように思えません。しかし、私のシステムでは、1Gファイルに対して、メソッド呼び出しのオーバーヘッドを約226uSに計算しました。実際のところパフォーマンスに影響を与えないと言っても過言ではないでしょう。

+0

[BufferedInputStream](http://www.docjar.com/docs/api/java/io/BufferedInputStream.html)を手動で使用していますか? –

答えて

1

バッファサイズを指定できるBufferedInputStreamにラップします。

+0

これは、whileループでfileinputstreamのreadメソッドをラップするだけではありませんか? – cmcginty

+0

基礎となるFileInputStreamが8kごとにOS read()を発行するのに役立つでしょうか? OSのI/Oサブシステムが複数の連続した読み込みを一括して処理するかもしれないが、JavaからOSへの呼び出しのオーバヘッドはまだここにある。 – 9000

1

NIOを使用してファイルのメモリマップを試みることはできますが、8Kの問題は何か分かりません。 あなたは大きな配列に8Kをコピーするか、オフには、最後の読み取りからの戻り値であることで

public int read(byte[] b, 
       int off, 
       int len) 
     throws IOException 

を呼び出すために返された長さを使用することができます。

+0

8Kで1Gファイルを読むことは、2^17メソッド呼び出しです。私はJVMオーバーヘッドの低いベンチマークに興味があります。 – cmcginty

+0

その場合、FileChannel.mapがうまくいくかもしれませんが、私はこれらの呼び出しに問題はありません。 JVMは、ほとんどのオーバーヘッドを最適化します。 –

+0

また、OS/FSは独自の先読みバッファを担当しています。したがって、一歩進んだら、システムコールは比較的安価でなければなりません。 (例えば、IO読み取り自体のシステムコールのオーバヘッドは何ですか?) –

0

表示される各読み取りのサイズは、オペレーティングシステム自体が使用するバッファサイズである可能性があります。したがって、OSレベルで変更する必要があるかもしれません。あなたはそれをどのようにするかはシステムに依存します。ファイルシステムを作成するときにブロックサイズを指定できる場合があります。これは伝統的にUnixファイルシステムで可能でした。皮肉なことに、私はこの機能が小さなファイルがたくさんあると予想されるファイルシステムのための小さなブロックを使用すると信じていました。

関連する問題