如何斯卡拉脚本,从网络驱动器读取5G日志文件应该以阅读最后x线(如在Unix的“尾巴”)进行修改?
题
如何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
}
}
不隶属于 StackOverflow