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