如何斯卡拉脚本,从网络驱动器读取5G日志文件应该以阅读最后x线(如在Unix的“尾巴”)进行修改?

StackOverflow https://stackoverflow.com/questions/1669277

  •  13-09-2019
  •  | 
  •  

如何Scala的脚本从网络驱动器读取5G日志文件应以读取最后x线(如在Unix的“尾部”)?

被修饰
::#!
@echo off
call scala %0 %*
goto :eof
::!#

import scala.io.Source
if (args.length > 0) {
for (line <-Source.fromFile(args(0)).getLines)
if(line.contains("percent")){
    print(line)
}
}
有帮助吗?

解决方案

我使用一个可变的队列在这一个:

::#!@echo off
call scala %0 %*
goto :eof
::!#
import scala.io.Source

val lastN = 5 // I guess you'll be getting them from args, but...
val queue = new scala.collection.mutable.Queue[String]

if (args.length > 0) {
  Source.fromFile(args(0)).getLines foreach { line =>
    queue.enqueue(line)
    if (queue.size > lastN) queue.dequeue
  }
  for (line <- queue)
    if (line.contains("percent")){
      print(line)
    }
}

如果使用不可变队列中,我会使用一个reduceLeft,但我看到没有点使用一个不变的队列此。

其他提示

如果读取文件是昂贵的,因为我希望它是在网络上,我会寻求到文件的末尾,读取日志文件格式的逐渐变大的块(更多领域的知识可能在这里给你一个更好的策略)从结束,直到你找到你要找的行数。

您会明显地要保持你在每次迭代更新的X线的缓冲区:

var buf: List[String] = Nil

for (line <- ...) {
  buf = (buf ::: List(line)) match {
    case x :: xs if (xs.length == n) => xs 
  }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top