加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala快速文本文件读取并上传到内存

发布时间:2020-12-16 19:00:07 所属栏目:安全 来源:网络整理
导读:在 Scala中,为了读取文本文件并将其上传到数组中,通常的方法是 scala.io.Source.fromFile("file.txt").getLines.toArray 特别是对于非常大的文件,有没有更快的方法可能通过读取字节块到内存首先,然后用新的行字符分割? (有关常用方法,请参阅Read entire fil
在 Scala中,为了读取文本文件并将其上传到数组中,通常的方法是

scala.io.Source.fromFile("file.txt").getLines.toArray

特别是对于非常大的文件,有没有更快的方法可能通过读取字节块到内存首先,然后用新的行字符分割? (有关常用方法,请参阅Read entire file in Scala)

非常感谢.

解决方法

性能问题与数据读取方式无关.它已经被缓冲.没有任何事情发生,直到你真正迭代的行:

// measures time taken by enclosed code
def timed[A](block: => A) = {
  val t0 = System.currentTimeMillis
  val result = block
  println("took " + (System.currentTimeMillis - t0) + "ms")
  result
}

val source = timed(scala.io.Source.fromFile("test.txt")) // 200mb,500 lines
// took 0ms

val lines = timed(source.getLines)
// took 0ms

timed(lines.next) // read first line
// took 1ms

// ... reset source ...

var x = 0
timed(lines.foreach(ln => x += ln.length)) // "use" every line
// took 421ms

// ... reset source ...

timed(lines.toArray)
// took 915ms

考虑到我的硬盘驱动器的读取速度为每秒500mb,对于200mb,最佳时间将为400ms,这意味着除了不将迭代器转换为数组之外,没有改进的余地.

根据您的应用程序,您可以考虑直接使用迭代器而不是使用数组.因为在内存中使用这么大的数组一定是一个性能问题.

编辑:从你的意见我想,你想进一步转换数组(也许将行分为列,如您所说的读数字数组).在这种情况下,我建议在阅读时进行转换.例如:

source.getLines.map(_.split(",").map(_.trim.toInt)).toArray

source.getLines.toArray.map(_.split(",").map(_.trim.toInt))

(对我来说,它是1.9s而不是2.5s)因为您不会将整个巨型阵列转换为另一个阵列,而是将每个阵列单独转换,最终以单个阵列(仅使用一半的堆空间).此外,由于读取文件是瓶颈,读取时的转换有利于提高CPU利用率.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读