代码之家  ›  专栏  ›  技术社区  ›  Farhan Islam

如何在scala中将字节数组分成块?

  •  0
  • Farhan Islam  · 技术社区  · 6 年前

    我正在尝试基于从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字节数组后剩余的。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Andrey Tyukin    6 年前

    自从 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)