2

これは私の前の質問のフォローアップです。

ファイルを並行して処理するとします。ここで、処理結果をファイルに書き込みたいと思います。結果がメモリに収まらないため、すべてのファイルの処理が完了するまで待ってから結果を書き込むことはできません。どういうわけか、処理と書き込みを並行して行う必要があります。

例: 数字を含むファイルがあるとします。ファイルサイズは約500M. ファイル数は約200です。各ファイルはメモリに収まりますが、すべてが収まりません。ここで、これらのファイルで見つかったすべての偶数を別のファイルに書き込みたいと思います。

Scala でそれを行う方法 (Futuresと Scalaを使用parallel collections)?

4

2 に答える 2

5

ある時点で、書き込みを同期する必要があります。他のスレッドをブロックしたくない場合、1 つの可能性は、アクターを使用して結果をファイルに書き込むことです。これは次のようになります。

class FileWriterActor(path: String) extends Actor {

  val file = ... // init FileWriter

  // this is how you implement an akka actor
  // plain scala actors look a bit different        
  def receive = {
    case x: MyResult => file.write(x.toString)
  }

  override def postStop() = file.close()
}

// usage
val result = ... // calculation stuff
fileWriter ! result
于 2012-07-21T06:17:58.480 に答える
1

akka に慣れていない方へ:

import java.io.{File, PrintWriter}
import akka.actor.{Actor,ActorSystem,Props}

object AkkaWriterExample extends App{

  val outputPath : String = ???
  val system = ActorSystem("WriterSystem")
  val writer = system.actorOf(Props(new WriterActor(new File(outputPath))), name="writer")
  writer ! "this is a test"
  system.shutdown()
  system.awaitTermination()
}

class WriterActor(outFile: File) extends Actor {

  val writer = new PrintWriter(outFile)

  // this is how you implement an akka actor
  // plain scala actors look a bit different        
  def receive = {
    case str:String => println(str); writer.write(str);
  }

  override def postStop() = {
    writer.flush(); 
    writer.close();
  }
}
于 2015-08-18T15:04:53.633 に答える