Как разделить массив байтов на куски в Scala?

Я пытаюсь реализовать логику фрагментирования на основе файлов разных размеров от 0 МБ до 15 МБ. У меня есть байтовый массив файла, но я пытаюсь разбить массив на куски размером менее 5 МБ.

Например, если у меня есть файл размером 10,6 МБ (1,06e+7 байт), я хочу разделить его на отдельные байтовые массивы, которые в сумме составляют 1,06e+7 байт. Это должно быть в состоянии обрабатывать файлы любого размера <15 МБ.

var chunkSize: Int = 5242880
    for(index <- 0 to byteArraySize by chunkSize) {

          if (index == 0){
            tempArray = byteArray.slice(index, chunkSize)
          } else{
            tempArray = byteArray.slice(index+1, (index + chunkSize))
          }
// upload tempArray to DB
          segmentIndex = segmentIndex + 1

        }

Проблема, которую я имею с этим, состоит в том, что последний кусок не правильного размера. Это должно быть то, что осталось в байтовом массиве после того, как он был разделен на 5242880 байтовых массивов.

1 ответ

Решение

Так как grouped-method возвращает ленивый итератор, и поэтому, вероятно, не тратит впустую память, я не вижу причин, чтобы не использовать его:

for (chunk <- byteArray.grouped(chunkSize)) {
  // do sth. with `chunk`
}

Вот как вы могли бы сделать это без использования встроенных методов:

def forEachChunk[A](arr: Array[A], chunkSize: Int)(f: Array[A] => Unit): Unit = {
  for (i <- 0 to arr.size by chunkSize) {
    f(arr.slice(i, (i + chunkSize) min arr.size))
  }
}

пример:

forEachChunk((0 to 10).toArray, 3){ chunk => 
  println(chunk.toList)
}

печатает:

List(0, 1, 2)
List(3, 4, 5)
List(6, 7, 8)
List(9, 10)
Другие вопросы по тегам