【问题标题】:Scalish way to read file and do something when end of file reachedScalish 读取文件并在到达文件末尾时执行某些操作的方式
【发布时间】:2014-03-02 11:56:18
【问题描述】:

我正在尝试找到一种更优雅、更简单的方式来逐行读取文件并调用函数 当到达文件末尾时。这是我目前的实现:

val source = scala.io.Source.fromFile("data.txt")    
for(line  <- source.getLines())
{
   // do something with data
   println(line)
}

// end of file reached do something else
doSomethingWithAllDataLoaded()

在这里,我需要更少的迭代并同时运行此文件读取并最终调用回调函数到达文件的每个结尾。

【问题讨论】:

    标签: scala playframework playframework-2.2


    【解决方案1】:

    您可以像这样阅读文件更具有 Scala 风格:

    val source = scala.io.Source.fromFile("data.txt")
    source.getLines.foreach(println(_))
    

    要并行处理行,请考虑parallel collections。这看起来像这样:

    source.getLines.toList.par.foreach(println(_))
    

    但请记住,这种方式首先读取文件中的所有行,然后开始并行处理它们。

    希望对你有帮助

    编辑

    如果您想避免在内存中加载文件 - 只需使用 Source.fromFile(...).getLines。它返回一个已经很懒惰的Iterator[String]。更重要的是,您不应使用.toList 或类似名称来避免内存问题。像这样的方法会破坏 Iterator 的所有惰性并强制进行严格(非惰性、急切)收集。

    【讨论】:

    • 其实我想做的是并行读取很多文件,避免因为它们很大而将它们加载到内存中。
    • 并行磁盘 IO ?通常是个坏主意。磁盘访问是顺序的,同时读取多个文件意味着来回移动磁头,这会减慢一切……最好顺序读取数据块并并行处理块。当然你也可以考虑一个(昂贵的)花哨的并行 IO 文件系统......
    • @paradigmatic SSD 驱动器怎么样?没有磁盘,没有磁头。随机访问时间应该很快。
    • @cyrillk 实际上,较低的延迟意味着较低的减速。但我不认为您可以并行读取多个文件并获得与顺序读取同一磁盘上的相同文件相比的加速。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-26
    • 1970-01-01
    相关资源
    最近更新 更多