Cómo el guión Scala que lee archivo de registro 5G de unidad de red debe ser modificado con el fin de leer las últimas líneas x (como 'cola' en Unix)?

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

  •  13-09-2019
  •  | 
  •  

Pregunta

Como el guión Scala que lee archivo de registro 5G de unidad de red debe ser modificado con el fin de leer las últimas líneas x (como 'cola' en 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)
}
}
¿Fue útil?

Solución

Estoy usando una cola mutable en éste:

::#!@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)
    }
}

Si se utiliza una cola inmutable, que haría uso de un reduceLeft, pero no veo ningún punto en el uso de una cola inmutable para esto.

Otros consejos

Si la lectura del fichero es caro, como espero es través de la red, me busco hasta el final del archivo y leer fragmentos progresivamente más grandes (más conocimiento del dominio del formato de archivo de registro podría darle una mejor estrategia aquí ) desde el final hasta que encuentre el número de líneas que usted está buscando.

Obviamente va tiene que mantener un buffer de líneas x, que se actualiza en cada iteración:

var buf: List[String] = Nil

for (line <- ...) {
  buf = (buf ::: List(line)) match {
    case x :: xs if (xs.length == n) => xs 
  }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top