どのようにネットワークドライブから5Gログファイルを読み込み、Scalaのスクリプトは(Unixのの「尾」などの)最後のx個の行を読み取るために修正すべき?

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

  •  13-09-2019
  •  | 
  •  

質問

どのようにネットワークドライブから5Gログファイルを読み込み、Scalaのスクリプトは、(Unixの中に「尾部」のような)最後のx個の行を読み取るために修正すべきか。

::#!
@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)
}
}
役に立ちましたか?

解決

私はこの1つで変更可能なキューを使用しています:

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

は不変キューを使用している場合、私はreduceLeftを使用したいが、私はこのために不変キューを使用しない点を見ていない。

他のヒント

私はそれがネットワーク上で期待通りにファイルを読み込むことは、高価である場合は、

、私は、ファイルの末尾をシークし、ここにあなたのより良い戦略を与えるかもしれないログファイル形式の次第に大きくチャンク(より多くの領域の知識を読みました)端から、あなたが探している行数を見つけるまで。

あなたは明らかにあなたが各反復で更新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