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