我试图基于从0MB到15MB的各种文件大小实现分块逻辑。我有文件的字节数组,但是我试图将数组分块成小于5MB的块。
例如,如果我有一个10.6MB(1.06e + 7字节)的文件,我想将此文件划分为多个单独的字节数组,它们相加1.06e + 7个字节。这应该能够处理任何小于15MB的文件。
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字节数组之后,应该是字节数组中剩下的内容。
答案 0 :(得分:2)
由于grouped
方法返回了一个惰性迭代器,因此可能不会浪费任何内存,因此我看不出任何不使用它的理由:
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)