Как прибывает, .array () не работает над ByteBuffers, возвращенным из map'ed FileChannels?

Это зависит от того, сколько раз вы хотите выполнить тест на одних и тех же данных.

Если вы выполняете тест один раз, вероятно, нет никакого существенного способа ускорить алгоритм.

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

Для ваших данных таблица поиска будет 128 ^ 3 = 2 097 152. Если вы можете управлять одной из трех переменных, поэтому вы рассматриваете все случаи, когда start = N одновременно, тогда размер рабочего набора уменьшается до 128^2 = 16432 байтов, что должно хорошо вписаться в большинство современных кэшей.

Вам все равно придется сравнить реальный код, чтобы увидеть, является ли таблица поиска без ответвлений достаточно быстрой, чем очевидные сравнения.

6
задан Charles 17 November 2011 в 17:12
поделиться

1 ответ

Я собираюсь предположить, что речь идет о методе FileChannel.map , который может отображать файл в память, к которой можно получить доступ с помощью MappedByteBuffer .

В документации для метода FileChannel.map , если файл отображается как доступный только для чтения, любая попытка изменить буфер приведет к исключению ReadOnlyBufferException :

Область файла. может быть отображен в память в одном из трех режимов:

  • Только для чтения: любая попытка изменения полученный буфер вызовет ReadOnlyBufferException , которое необходимо выбросить. ( MapMode.READ_ONLY )

Что касается исключений, создаваемых методом ByteBuffer.array , существует два типа исключений, которые возникают в зависимости от причины проблемы:

Выдает:

  • ReadOnlyBufferException - если этот буфер поддерживается массивом, но доступен только для чтения
  • UnsupportedOperationException - Если этот буфер не поддерживается доступным массивом

Хотя исключение не упоминается в вопросе, возможно, файл, доступный только для чтения, вызывает исключение ReadOnlyBufferException , вызываемое методом array .

Также следует упомянуть что метод ByteBuffer.array является необязательной операцией:

Возвращает байтовый массив, который поддерживает это буфер (дополнительная операция).

Чтобы быть уверенным, что метод array вернет байт [] , который можно использовать, вызовите метод hasArray как предложено в документации для метода array :

Вызвать метод hasArray перед вызывая этот метод, чтобы убедитесь, что этот буфер имеет accessible backing array.

3
ответ дан 17 December 2019 в 18:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: