2011-01-26 3 views
1

При вызове read(byte[]) на FileInputStream размер чтения всегда равен 8k, даже если значение byte[] экспоненциально велико.Увеличение внутреннего размера буфера, используемого Java FileInputStream

Как увеличить максимальную сумму чтения, возвращаемую за звонок?

Пожалуйста, не предлагайте метод, который просто маскирует ограничение FileInputStream.


Update: Там, кажется, не быть реальным решением этой проблемы. Тем не менее, я вычислил накладные расходы вызова метода около 226uS в моей системе, для 1G-файла. Вероятно, безопасно сказать, что это не повлияет на производительность каким-либо реальным способом.

+0

Включает ли это вручную с помощью [BufferedInputStream] (http://www.docjar.com/docs/api/java/io/BufferedInputStream.html)? –

ответ

1

Оберните его в BufferedInputStream, который позволяет указать размер буфера.

+0

Разве это не просто завершает метод чтения fileinputstream в цикле while? – cmcginty

+0

Будет ли это способствовать тому, что базовый FileInputStream выдаст операционную систему read() каждые 8k? Возможно, подсистема ввода/вывода ОС будет выполнять несколько последовательных чтений вместе, но накладные расходы на вызов Java-OS все еще здесь. – 9000

1

Вы можете попробовать создать карту памяти с помощью NIO, но я не уверен, в чем проблема с 8K. Вы можете либо скопировать 8K на ваш больший массив или использовать возвращаемую длину для вызова

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

С от того возвращаемого значения из последнего чтения.

+0

Чтение 1G-файла при 8K - вызов вызова 2^17. Я заинтересован в бенчмаркинге с более низкими накладными расходами JVM. – cmcginty

+0

В этом случае FileChannel.map может работать лучше для вас, хотя я не вижу проблемы с этими вызовами. В любом случае JVM оптимизирует большинство накладных расходов. –

+0

Также ОС/FS несут ответственность за свои собственные буферы чтения. Поэтому, когда он становится в порядке, системные вызовы должны быть относительно дешевыми. (Например, что связано с системным вызовом для чтения IO?) –

0

Размер каждого считываемого вами изображения может быть размером буфера, используемым самой операционной системой. Таким образом, вам может потребоваться внести изменения на уровне ОС. Как вы это сделаете, зависит от системы. Вы можете указать размер блока при создании файловой системы. Это традиционно было возможно для файловых систем Unix. Хотя по иронии судьбы, я считаю, что функция была использована для создания небольших блоков для файловых систем, которые, как ожидается, будут иметь множество небольших файлов.

Смежные вопросы