Первая инициализация RandomAccessFile медленная, затем быстрая

Я заметил, что первая инициализация объекта RandomAccessFile в Java происходит намного медленнее, чем последующие инициализации объектов RandomAccessFile в том же файле на диске. Есть ли какое-то фоновое кэширование, которое делает ОС, чтобы сделать это возможным?

Показательный пример: я загружаю изображения с диска и позволяю пользователю пролистывать их. Я надеялся, что узким местом будет отображение изображений, но при первой загрузке узким местом была загрузка изображений (узкое место было найдено с помощью JProfiler; RandomAccessFile<Init> ~8 мс на вызов). Если я пролистывал изображения, которые уже просматривал, вызовы RandomAccessFile<Init> длились всего несколько микросекунд.

Кто-нибудь когда-нибудь видел что-то подобное? Есть ли обходные пути? Набор данных может содержать 100 000 изображений, поэтому инициализация группы фиктивных RandomAcessFile объектов может оказаться неосуществимой.

Строка кода для инициализации проста:

RandomAccessFile fileIn = new RandomAccessFile(abspath, "r");


person ddukki    schedule 02.03.2016    source источник
comment
@Андреас Спасибо! Просто чтобы понять, что он кеширует, и есть ли способ обойти это? Может быть, это поможет использовать что-то другое, кроме RandomAccessFile, или это общая проблема для ввода-вывода?   -  person ddukki    schedule 03.03.2016
comment
Если вы обойдете кеширование, последующие открытия файла будут такими же медленными, как и первое, так зачем вам это? Кэширование не замедляет работу при первом открытии файла, оно повышает производительность при повторном открытии файла, поскольку не нужно ждать, пока медленный жесткий диск прочитает данные.   -  person Andreas    schedule 03.03.2016
comment
@Andreas Андреас Извините, не в обход кэширования. Я имел в виду, есть ли способ не полагаться на кеширование? т.е. является ли реализация RandomAccessFile проблемой, и кэширует ли она больше информации, чем необходимо? Я не слишком хорошо знаком с тонкостями файлового ввода-вывода Java. Мне просто нужно быстрое чтение изображений из разных мест в файле. Я попробую MappedByteBuffer, которые я видел в обсуждениях.   -  person ddukki    schedule 03.03.2016
comment
@ScaryWombat Изображения загружаются не все сразу. Они загружаются по запросу, поэтому у меня возникают задержки. Проблема в том, что я не могу предсказать порядок или время загрузки изображений, поэтому это нужно делать на лету.   -  person ddukki    schedule 03.03.2016
comment
Извините, я неправильно прочитал вопрос.   -  person Scary Wombat    schedule 03.03.2016
comment
Как уже сказал вам @Andreas, реализация кэширования — это решение, а не проблема. Реализация RandomAccessFile тут ни при чем. Это просто самая тонкая оболочка над вызовами собственной файловой системы. В частности, Java не выполняет никакого собственного кэширования. Не то чтобы это было проблемой.   -  person user207421    schedule 03.03.2016
comment
@EJP понял. Всем спасибо за информацию.   -  person ddukki    schedule 03.03.2016
comment
@ Андреас Андреас, я был бы рад использовать ваш комментарий в качестве ответа, если вы хотите его создать.   -  person ddukki    schedule 03.03.2016


Ответы (1)


Да, кеш ОС.

Если вы обойдете кэширование ОС, последующие открытия файла будут такими же медленными, как и первое, так зачем вам это?

Кэширование не замедляет работу при первом открытии файла, оно повышает производительность при повторном открытии файла, поскольку не нужно ждать, пока медленный жесткий диск прочитает данные.

person Andreas    schedule 03.03.2016