Скала читать большие файлы

Здравствуйте, я ищу самый быстрый способ довольно высокого уровня для работы с большим сбором данных. Моя задача состоит из двух задач: прочитать много больших файлов в памяти и затем выполнить некоторые статистические вычисления (самый простой способ работы с данными в этой задаче - это массив произвольного доступа).

Мой первый подход был использовать java.io.ByteArrayOutputStream, потому что это может изменить размер своего внутреннего хранилища.

def packTo(buf:java.io.ByteArrayOutputStream,f:File) = {
  try {
    val fs = new java.io.FileInputStream(f)
    IOUtils.copy(fs,buf)
  } catch  {
    case e:java.io.FileNotFoundException =>
  }
}

    val buf = new java.io.ByteArrayOutputStream()
    files foreach { f:File  => packTo(buf,f) } 
    println(buf.size())

    for(i <- 0 to buf.size()) {
       for(j <- 0 to buf.size()) {
          for(k <- 0 to buf.size()) {
       //  println("i  " + i + "  " + buf[i] );
                   // Calculate something amathing using buf[i] buf[j] buf[k] 
          }
       }
    }

    println("amazing = " + ???)

но ByteArrayOutputStream не может получить меня как byte[] только его копия. Но я не могу позволить иметь 2 копии данных.

2 ответа

Решение

Вы пробовали скалао? Должно быть так же просто, как Resource.fromFile(f).byteArray с этим.

Встроенная библиотека Scala уже предоставляет хороший API для этого

io.Source.fromFile("/file/path").mkString.getBytes

Однако не всегда хорошая идея загружать весь файл в виде байтового массива в память. Удостоверьтесь, что максимально большой файл все еще может поместиться в вашей памяти JVM должным образом.

Другие вопросы по тегам