네트워크 드라이브에서 5G 로그 파일을 읽는 스칼라 스크립트를 어떻게 수정해야합니까 (UNIX의 'Tail'예 : UNIX)를 읽으려면 어떻게해야합니까?

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

  •  13-09-2019
  •  | 
  •  

문제

네트워크 드라이브에서 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 
  }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top