Como o script Scala que lê arquivo de log 5G da unidade de rede deve ser modificada a fim de ler x linhas últimos (como 'cauda' em Unix)?
Pergunta
Como o script Scala que lê arquivo de log 5G da unidade de rede deve ser modificada a fim de ler x linhas últimos (como 'cauda' em 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)
}
}
Solução
Eu estou usando uma fila mutáveis ??em um presente:
::#!@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)
}
}
Se estiver usando uma fila imutável, eu usaria um reduceLeft, mas não vejo nenhum ponto em usar uma fila imutável para isso.
Outras dicas
Se a leitura do arquivo é caro, como eu espero que isso é através da rede, eu procurar ao final do arquivo e ler pedaços progressivamente maiores (mais conhecimento de domínio do formato de arquivo de log pode dar-lhe uma melhor estratégia aqui ) a partir do final até encontrar o número de linhas que você está procurando.
Você obviamente tem que manter um buffer de x linhas que você atualizar em cada iteração:
var buf: List[String] = Nil
for (line <- ...) {
buf = (buf ::: List(line)) match {
case x :: xs if (xs.length == n) => xs
}
}