Я пытаюсь прочитать двоичный файл (16 МБ), в котором у меня есть только целые числа, закодированные на 16 бит. Поэтому для этого я использовал куски размером 1 МБ, которые дают мне массив байтов. Для моих собственных нужд я преобразовываю этот массив байтов в короткий массив со следующей функцией convert, но чтение этого файла с помощью буфера и преобразование его в короткий массив займет у меня 5 секунд, это быстрее, чем мое решение?Эффективный способ чтения двоичных файлов в scala
def convert(in: Array[Byte]): Array[Short] = in.grouped(2).map {
case Array(one) => (one << 8 | (0 toByte)).toShort
case Array(hi, lo) => (hi << 8 | lo).toShort
} .toArray
val startTime = System.nanoTime()
val file = new RandomAccessFile("foo","r")
val defaultBlockSize = 1 * 1024 * 1024
val byteBuffer = new Array[Byte](defaultBlockSize)
val chunkNums = (file.length/defaultBlockSize).toInt
for (i <- 1 to chunkNums) {
val seek = (i - 1) * defaultBlockSize
file.seek(seek)
file.read(byteBuffer)
val s = convert(byteBuffer)
println(byteBuffer size)
}
val stopTime = System.nanoTime()
println("Perf of = " + ((stopTime - startTime)/1000000000.0) + " for a duration of " + duration + " s")
Er, в каком десятилетии 16 мегабайт «огромный»? Накладные расходы JVM обычно составляют 10 или более раз. –
Возможно, это потому, что я впервые читал такие файлы, но я удалил «огромный». – alifirat