كيف يجب تعديل البرنامج النصي SCALA الذي يقرأ ملف سجل 5G من محرك أقراص الشبكة من أجل قراءة خطوط X الأخيرة (مثل "الذيل" في UNIX)؟

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

  •  13-09-2019
  •  | 
  •  

سؤال

كيف يجب تعديل البرنامج النصي SCALA الذي يقرأ ملف سجل 5G من محرك أقراص الشبكة من أجل قراءة خطوط X الأخيرة (مثل "الذيل" في 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)
    }
}

إذا كنت تستخدم قائمة انتظار ثابتة، فسأستمر في وضع تخفيض، لكنني لا أرى أي وقت باستخدام قائمة انتظار ثابتة لهذا.

نصائح أخرى

إذا كانت قراءة الملف باهظ الثمن، فأنت أتوقع أن يكون عبر الشبكة، سأبحث عن نهاية الملف وقراءة قطع أكبر تدريجيا (قد يوفر لك المزيد من معرفة المجال بتنسيق ملف السجل استراتيجية أفضل هنا) من تنتهي حتى تجد عدد الخطوط التي تبحث عنها.

من الواضح أن عليك أن تبقي مخزن مؤقت من خطوط 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