Я заметил, что первая инициализация объекта RandomAccessFile
в Java происходит намного медленнее, чем последующие инициализации объектов RandomAccessFile
в том же файле на диске. Есть ли какое-то фоновое кэширование, которое делает ОС, чтобы сделать это возможным?
Показательный пример: я загружаю изображения с диска и позволяю пользователю пролистывать их. Я надеялся, что узким местом будет отображение изображений, но при первой загрузке узким местом была загрузка изображений (узкое место было найдено с помощью JProfiler; RandomAccessFile<Init>
~8 мс на вызов). Если я пролистывал изображения, которые уже просматривал, вызовы RandomAccessFile<Init>
длились всего несколько микросекунд.
Кто-нибудь когда-нибудь видел что-то подобное? Есть ли обходные пути? Набор данных может содержать 100 000 изображений, поэтому инициализация группы фиктивных RandomAcessFile
объектов может оказаться неосуществимой.
Строка кода для инициализации проста:
RandomAccessFile fileIn = new RandomAccessFile(abspath, "r");
RandomAccessFile
, или это общая проблема для ввода-вывода? - person ddukki   schedule 03.03.2016RandomAccessFile
проблемой, и кэширует ли она больше информации, чем необходимо? Я не слишком хорошо знаком с тонкостями файлового ввода-вывода Java. Мне просто нужно быстрое чтение изображений из разных мест в файле. Я попробуюMappedByteBuffer
, которые я видел в обсуждениях. - person ddukki   schedule 03.03.2016RandomAccessFile
тут ни при чем. Это просто самая тонкая оболочка над вызовами собственной файловой системы. В частности, Java не выполняет никакого собственного кэширования. Не то чтобы это было проблемой. - person user207421   schedule 03.03.2016