Comment le script Scala qui lit le fichier journal 5G à partir du lecteur réseau doit être modifié afin de lire dernières lignes x (comme « queue » sous Unix)?

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

  •  13-09-2019
  •  | 
  •  

Question

Comment le script Scala qui lit le fichier journal 5G à partir du lecteur réseau doit être modifié afin de lire dernières lignes x (comme « queue » sous 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)
}
}
Était-ce utile?

La solution

J'utilise une file d'attente mutable dans celui-ci:

::#!@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 vous utilisez une file d'attente immuable, j'utiliser un reduceLeft, mais je ne vois pas en utilisant une file d'attente immuable pour cela.

Autres conseils

Si la lecture du fichier est cher, comme je l'attends, il est sur le réseau, je cherche à la fin du fichier et lire des morceaux progressivement plus importants (plus de connaissances de domaine du format de fichier journal peut vous donner une meilleure stratégie ici ) à partir de la fin jusqu'à ce que vous trouverez le nombre de lignes que vous recherchez.

Vous aurez évidemment de garder une mémoire tampon de lignes x que vous mettez à jour à chaque itération:

var buf: List[String] = Nil

for (line <- ...) {
  buf = (buf ::: List(line)) match {
    case x :: xs if (xs.length == n) => xs 
  }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top