Я хочу использовать следующий код в 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 в самый прямой способ?
Вы должны будете использовать dotimes
вместо for
и loop..recur
а не while
.
Однако, если вы действительно после производительности, вместо чтения, я бы карту памяти FileChannel
и создать LongBuffer
из ByteBuffer
чтобы читать байты восемь на восемь.
dotimes
иloop..recur
. Хорошие напоминания. При использовании отображения памяти вFileChannel
у вас есть справка о том, как это сделать? И вы имеете в виду использованиеMappedByteBuffer
?