如何在Scala中并行编写流程文件并写入结果?

时间:2012-07-21 05:27:08

标签: file scala parallel-processing

这是我previous问题的后续行动。

假设我并行处理我的文件。现在我想将处理结果写入文件。由于结果不适合内存,我不能等到所有文件的处理完成然后写结果。我必须以某种方式并行处理和写作。

例如:假设我有包含数字的文件。文件大小约为500M。文件数约为200。每个文件都适合内存,但所有文件都不适合。现在我想将这些文件中找到的所有甚至号码写入另一个文件。

如何在Scala(使用Futures和Scala parallel collections)中执行此操作?

2 个答案:

答案 0 :(得分:5)

在某些时候你必须同步写作。如果您不想阻止其他线程,则可以使用actor将结果写入文件。这看起来像这样:

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

答案 1 :(得分: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();
  }
}