【问题标题】:scala read large filesscala读取大文件
【发布时间】:2013-05-24 10:57:37
【问题描述】:

您好,我正在寻找最快的蝙蝠而不是高级的方式来处理大型数据收集。 我的任务包括两个任务,读取内存中的大量大文件,然后进行一些统计计算(在此任务中处理数据的最简单方法是随机访问数组)。

我的第一种方法是使用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 个数据副本。

【问题讨论】:

    标签: scala large-files bytearrayoutputstream


    【解决方案1】:

    你试过scala-io吗?应该和Resource.fromFile(f).byteArray 一样简单。

    【讨论】:

    【解决方案2】:

    Scala 的内置库已经提供了一个很好的 API 来执行此操作

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

    但是,将整个文件作为字节数组加载到内存中通常不是一个好主意。请确保尽可能大的文件仍能正确放入您的 JVM 内存中。

    【讨论】:

    • 如果文件真的像 OP 所说的那样大,这个文件将产生OOM
    • 如果文件不包含文本,转换为String 是没有意义和危险的。在任何情况下,转换为String 以获取文件的原始字节既太昂贵,也不能保证产生原始字节。最后,不建议在不指定编码的情况下执行字节序列 -> StringString -> 字节序列转换。
    • 我们确实需要指定编码,它只是隐含的。完整的方法签名是def fromFile(name : String)(implicit codec : Codec)。是的,从File -> String -> Array[Byte] 转换会产生性能开销,但大多数时候(尤其是在编写一些脚本时)不值得花费更多昂贵的开发时间来探索和解决外部库跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多