Java FileChannel с ByteBuffer в Clojure?

1

Я хочу использовать следующий код в Clojure для быстрого чтения файла в память:

FileInputStream f = new FileInputStream( name );
FileChannel ch = f.getChannel( );
byte[] barray = new byte[SIZE];
ByteBuffer bb = ByteBuffer.wrap( barray );
long checkSum = 0L;
int nRead;

while ((nRead = ch.read(bb)) != -1) {
    for (int i = 0; i < nRead; i++)
        checkSum += barray[i];

    bb.clear( );
}

Код из: FileChannel с массивом ByteBuffer и доступ к массиву байтов

Вызов конструкторов классов Java и меток dot достаточно прост, но будет использовать Clojure в while и for причиной значительного снижения производительности? Есть ли что-то не так, просто пытается конвертировать Clojure в самый прямой способ?

Теги:
file
performance
clojure

1 ответ

2

Вы должны будете использовать dotimes вместо for и loop..recur а не while.

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

  • 0
    Спасибо за ваши комментарии о dotimes и loop..recur . Хорошие напоминания. При использовании отображения памяти в FileChannel у вас есть справка о том, как это сделать? И вы имеете в виду использование MappedByteBuffer ?
  • 0
    Да, MappedByteBuffer, возвращенный docs.oracle.com/javase/7/docs/api/java/nio/channels/…, а затем вызовите asLongBuffer (и выполните некоторое переключение битов для доступа к отдельным байтам).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню