네트워크 드라이브에서 5G 로그 파일을 읽는 스칼라 스크립트를 어떻게 수정해야합니까 (UNIX의 'Tail'예 : UNIX)를 읽으려면 어떻게해야합니까?
문제
네트워크 드라이브에서 5G 로그 파일을 읽는 스칼라 스크립트를 어떻게 수정해야합니까 (UNIX의 'Tail'예 : 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)
}
}
불변의 대기열을 사용하는 경우 ReduLeft를 사용하지만 불변의 대기열을 사용하는 데 아무런 의미가 없습니다.
다른 팁
파일을 읽는 것이 비싸다면 네트워크를 통해 예상되므로 파일의 끝을 찾고있을 것입니다. 나는 점차 더 큰 청크를 읽습니다 (로그 파일 형식에 대한 더 많은 도메인 지식이 여기에서 더 나은 전략을 제공 할 수 있습니다). 찾고있는 줄의 수를 찾을 때까지 끝납니다.
각 반복에 대해 업데이트 할 X 라인 버퍼를 보관해야합니다.
var buf: List[String] = Nil
for (line <- ...) {
buf = (buf ::: List(line)) match {
case x :: xs if (xs.length == n) => xs
}
}
제휴하지 않습니다 StackOverflow